2010-05-20 19 views
6

Estoy desarrollando un servicio web y debo enviar un nombre de usuario y una contraseña al servicio en un método GET. ¿Está bien enviar esta información en la uri siempre que esté pasando por un canal seguro como ssl? En otras palabras, ¿puedo tener un uri que se parezca a/users/{username}/{cleartext_password}?Enviar nombre de usuario y contraseña al servicio web

Editar: Lo siento, creo que no estaba claro. El servicio web es esencialmente solo una base de datos de nombres de usuario y contraseñas hash. Imagine una aplicación de escritorio que mantiene nombres de usuario y contraseñas en una base de datos remota. El usuario final escribe su nombre de usuario y contraseña en la aplicación y la aplicación accede al servicio web para autenticar al usuario.

Por lo tanto, la aplicación deberá enviar al usuario el nombre de usuario y la contraseña de texto sin formato del usuario final. El servicio tomará el nombre de usuario y la contraseña y comprobará que el nombre de usuario y el hash de la contraseña coincidan con el nombre de usuario y la contraseña hash en la base de datos. La aplicación en sí tendrá que autenticarse antes de que pueda acceder al servicio, pero me pregunto cuál es la mejor manera de enviar el nombre de usuario y la contraseña del usuario final al servicio para autenticar al usuario final. No utilizo un método POST porque simplemente estoy autenticando y, por lo tanto, no estoy cambiando el estado del servidor. Perdón por la confusion.

Respuesta

0

En términos generales, esta no es una buena idea ... Estos datos estarán presentes en una serie de archivos de registro, por lo tanto, los datos podrían ser visibles para las personas que no deberían verlo. Por lo menos, debe hash o encriptar antes de enviarlo si puede.

Aquí es una discusión relacionada para un poco más de detalle ... Is an HTTPS query string secure?

+0

O usted podría mirar en hacer la autenticación SSL de dos vías.Los usuarios necesitarían certificados del mismo modo que los servidores, pero el servidor puede autenticar al usuario de forma segura. – mpez0

0

Si se va por un canal seguro, no hay que envía el nombre de usuario y contraseña como texto plano problema. Solo recomendaría no enviarlos como texto sin formato a través de un canal inseguro y no enviarlos repetidamente para cada solicitud.

Lo que podría hacer es primero autenticarse en el servicio web (envíe el nombre de usuario y la contraseña a través de ssl como texto sin formato) y obtenga un token del servidor que reconocerá. A continuación, envíe ese token con cada solicitud posterior.

+0

Google, por ejemplo, le permite enviar su nombre de usuario y contraseña a través de SSL para recuperar un SID para su API ... luego envía ese SID en una cookie con cada solicitud GET subsiguiente. Funciona bien. – EAMann

7

Hacer esto.

Enviar una "clave" y un "resumen".

La "clave" es equivalente a un nombre de usuario.

El "resumen" es un hash SHA1 (o MD5) de la clave, el URI y un "secreto compartido" o contraseña.

Cuando el servidor obtiene esto, calcula su propia versión del resumen, en función de la clave, el URI solicitado y el "secreto compartido" o contraseña. La falla para hacer coincidir los resúmenes es una respuesta de error 401.

+0

Esa es en realidad una solución muy elegante ... – EAMann

0

SSL encripta el URI, pero definitivamente eche un vistazo a algunas alternativas.

autenticación básica de HTTP es agradable y sencilla, y bien soportado por los navegadores, servidores web, etc.

Asimismo, no va a terminar en archivos de registro para el mismo grado que los URI

NB: Es sólo un poco Encabezados HTTP de texto sin formato, por lo que definitivamente NO se recomienda para aplicaciones que no sean SSL.

http://en.wikipedia.org/wiki/Basic_access_authentication

Cuestiones relacionadas