2010-01-07 33 views
8

Hola amigos, esto parece haber sido un debate bastante frecuente, pero quiero hacer una pregunta simple y diluida sobre la autentificación con servicios RESTful. El escenario es el siguiente:Servicio de autenticación de usuario RESTful

  • Existe un sistema que aloja usuarios registrados para una aplicación. El sistema expone una API RESTful para acceder a estos usuarios.
  • Hay una aplicación de interfaz que tiene un formulario de inicio de sesión. La aplicación puede ser interna o externa.
  • La aplicación de front-end debe usar los datos en el sistema de usuario para autenticar a un usuario.

La pregunta ahora es cómo autenticar a un usuario cuyas credenciales (nombre de usuario/contraseña) se ingresan en la aplicación cliente contra los datos en el sistema de usuario de modo que sea seguro y eficaz? Por el bien de esta pregunta, supongamos que la aplicación cliente es interna a algún tipo de Intranet, pero las aplicaciones no residirán en la misma máquina y solo podrán comunicarse a través del servicio.

Entiendo la idea de que la aplicación sea "hipermedia", pero deberíamos poder proporcionar servicios de filtrado/búsqueda. Por ejemplo, considere los recursos y de la API de la siguiente manera:

  • http://example.com/users
    • GET - recupera todos los usuarios (paginado, hipermedia impulsada)
    • Post - Crea un nuevo usuario
    • PUT/no elimina soportados
  • http://example.com/users/[id]
    • GET - devuelve una representación completa de un usuario con id = {id}
    • put - actualizaciones de usuario, toma en cualquier tipo de medio predefinido
    • Eliminar - elimina el usuario (con la autorización correspondiente)
    • post no soportado

base en lo anterior, mi idea sería tener la aplicación cliente de conseguir en la lista de usuario, filtrando por nombre de usuario. El servicio devolverá la contraseña y el valor saliente al cliente, el cliente realizará la autenticación.

¿Pensamientos?

+1

¿Puede ser más específico sobre cuál es la pregunta? Estoy teniendo dificultades para entender qué tipo de comentarios quieres. –

Respuesta

3

En primer lugar, no desea que el cliente realice la autenticación, ya que sería trivial escribir un cliente que se rompa en su servicio.

En su lugar, solo use un mecanismo de autenticación como HTTP Basic o HTTP Digest.

Tenga en cuenta que si está utilizando Java, el marco Restlet proporciona interceptores, llamados Guardias, que admiten estos y otros mecanismos. Recomiendo mucho a Restlet.

6

Si entiendo su pregunta correctamente, está buscando implementar un servicio genérico que manejará la autenticación, para que pueda volver a usarlo para diferentes aplicaciones.

Sugiero que eche un vistazo a OAuth que se ha creado precisamente para este dominio problemático.

4

Al pasar el nombre de usuario y la sal de nuevo es innecesario y un riesgo de seguridad real.

Tal vez usted podría considerar este enfoque:

que el cliente pase el nombre de usuario y contraseña al servidor a través Basic Authentication

El servidor recupera la contraseña cifrada para el nombre de usuario a lo largo de wiht la sal

El servidor cifra la contraseña dada usando algún método de cifrado, usando la sal para ayudar al algoritmo (sigue el código de Ruby):

def User.authenticate(login, password) 
    ok = false 

    user = User.find_by_login(login) 

    if user 
     # 
     # user contains the salt, it isn't passed from the client 
     # 
     expected_password = hash_password(password, user.salt) 

     ok = (user.password == expected_password) 
    end 

    return ok 
end 

Hay varios lugares para usar este tipo de enfoque, pero me gusta hacerlo en Rack.

último punto, hacerlo todo en una conexión HTTPS

0

Mozilla Persona

Dado que esta cuestión fue publicada, la Mozilla Foundation (el fabricante del navegador Firefox) ha asumido el problema de la autenticación de usuario sencilla. Su solución es Mozilla Persona, "un sistema de inicio de sesión para la Web". Diseñado para ser fácil para los usuarios y para desarrolladores. La identidad del usuario es una dirección de correo electrónico. Ver Wikipedia article.

actualización

Mozilla ha dado básicamente por el trabajo en Persona, pero not quite killed el proyecto.

4

Stormpath

Stormpath empresa dedicada a ofrecer una API de gestión de la conexión del usuario y el servicio para los desarrolladores. Usan un enfoque RESTJSON.

Hay otras empresas que parecen incursionar en esta nueva área de autenticación como servicio, pero Stormpath es la única que conozco que está dedicada a ella.

Cuestiones relacionadas