¿Cómo funciona el inicio de sesión con Social Login para un tercero de confianza?

3

Estoy intentando entender cómo agregar el inicio de sesión social y el registro a un servicio. Después de leer muchas publicaciones de blogs, muchas me recuerdan los inconvenientes de diseñar un sistema de este tipo, del hecho de que Oauth es para Autorización no Autenticación, la mayoría escritas por personas que exploran este tema mientras escriben, todas con opiniones diferentes sobre lo que conecta OpenID / OpenID / etc se trata, me encuentro más confundido que antes de empezar.

Entiendo que con el inicio de sesión social, el proveedor de ID realiza la autenticación. Cuando se autentica al usuario, el cliente (o el agente del usuario) debe estar en posesión de algo (¿un token seguro?) Que indique que el usuario logró probar su identidad. En las solicitudes posteriores a / the / API, el servidor, que desde el punto de vista del proveedor de ID es un tercero (¿se llama un usuario de confianza en algunos documentos?) Debería ser capaz de verificar este "token" y debe ser capaz de derivar de este "token" quién es el usuario real.

Entonces, en términos prácticos:

  • ¿Qué recibiría la API del cliente cuando un usuario inicia sesión? Usando con Social Login?
  • ¿Qué recibiría la API del cliente cuando un usuario se registre con Social Login?
  • Como mínimo, ¿qué debo almacenar acerca de cada usuario con fines de autenticación (¿ID de usuario? ¿Correo electrónico para recuperar / vincular varias cuentas? ¿Proveedor de ID (en qué formato?), ¿Lista de sesiones actuales / fechas de vencimiento? Última ¿Tiempo de acceso / actualización tal vez? ¿Qué más?)

El sistema actual (una API llena de REST) emite un token cuando el usuario inicia sesión con el correo electrónico / contraseña con una publicación en api.example.com/session . En este caso, la API puede verificar que el usuario proporcionó las credenciales correctas.

Supongo que muchos artículos en línea solo hablan sobre cómo usar los tokens para consumir los recursos proporcionados por esa misma organización, por ejemplo, el inicio de sesión de Facebook para consumir las API de Facebook. Sin embargo, este podría ser mi malentendido.

Algunas preguntas específicas:

  • ¿Qué aspecto tiene este token? ¿Revela el proveedor de identidad o cómo verificar la validez del token?
  • ¿El token le da a la parte que confía (los servidores backend de la API) una forma de obtener, por ejemplo, el nombre completo o la dirección de correo electrónico del usuario? ¿O sería esa funcionalidad delegada al cliente?
  • ¿Quién determina qué información proporciona este token? ¿El proveedor de ID o la aplicación cliente?
  • ¿Qué sucede con el caso de un cliente web en el que el cliente y el agente de usuario no se ejecutan en el mismo dispositivo? ¿Puede el cliente o el agente de usuario "construir" un token nuevo que se puede usar para firmar solicitudes a la API e incluir los detalles importantes (ID de usuario, proveedor de ID, fecha de caducidad, ID de cliente)?
  • ¿Se puede extender el punto final de "sesión" de la API para manejar tokens de "inicio de sesión social" o no es el enfoque correcto?
  • ¿Es importante identificar / autenticar al cliente? Si es así, ¿cómo ... creo que los clientes móviles no pueden almacenar una clave de firma de forma segura?

Una nota sobre oAuth y Autorización: No creo que necesite autorización aquí. La API ya determina si las solicitudes se autorizan en función del usuario identificado.

    
pregunta Johan 10.10.2016 - 12:13
fuente

1 respuesta

3

Le sugiero que comience con algunos de los cursos de Dominick Baier sobre Pluralsight . En particular, es posible que desee comenzar con su Introducción a OAuth2, OpenID Connect y JSON Web Tokens (JWT) .

Si está escribiendo servicios que requieren que el usuario inicie sesión cada vez que lo use, entonces no creo que quiera usar OAuth. Si está escribiendo algún tipo de aplicación móvil o de servicio que necesita iniciar sesión más tarde en estos servicios en nombre del usuario, entonces sí, debería considerar OAuth. Como explica Dominick Baier, la especificación de OAuth es un poco desordenada, y OpenID Connect lo es aún más.

Le sugiero que haga lo siguiente:

  1. Utilice un "Servicio de token seguro federado (STS)". El propósito del STS federado es emitir su aplicación con tokens de autenticación que contengan "reclamos" que su aplicación entienda. Por ejemplo, estas reclamaciones podrían contener la dirección de correo electrónico, el nombre completo, etc. del usuario, independientemente de lo que especifique. Cuando el usuario intenta acceder a sus servicios, se redirige a este "STS federado" que ofrece a los usuarios opciones sobre cómo desean iniciar sesión (Facebook, Google, Live, LinkedIn, etc.). Luego, el usuario inicia sesión, el STS federado recibe el token de autenticación de Facebook o LinkedIn o lo que sea, transforma el token y sus reclamos en un formato que su aplicación entiende, y su aplicación consume este token de autenticación bien hecho. Hay varios servicios federados de STS, incluidos Azure ACS, Azure Active Directory, etc.
  2. Es probable que desee que el token sea un token web JSON (JWT). En la configuración del Proveedor de identidad federada, usted especifica cómo desea que "transforme" las reclamaciones en un formato que su aplicación pueda entender. Por ejemplo, si la aplicación quiere un campo de "Nombre completo", y Facebook devuelve un campo de "Nombre" y "Apellido", puede indicar al STS federado que convierta la información de Facebook en un campo de "Nombre completo". Aquí hay un ejemplo de cómo se ve un JWT:

    {   "sub": "1234567890",   "nombre": "John Doe",   "admin": verdadero } pero puedes elegir tener los campos que quieras.

  3. Una vez que el cliente inicia sesión, se autentica y se redirige a su API, la API normalmente recibirá un encabezado HTTP con el token JWT, aunque hay otros esquemas.

  4. Puede configurar el STS federado para que también devuelva el nombre del proveedor de identidad que el usuario eligió (Facebook, LinkedIn, etc.)

  5. No entiendo completamente tu pregunta sobre el "cliente y agente de usuario" que no se está ejecutando, pero es posible que desees consultar OAuth2 y "actualizar tokens" para esto.

  6. Sí, es muy importante autenticar al cliente.

  7. En lugar de extender la API para manejar diferentes tipos de esquemas de autenticación y tokens, creo que debería usar el esquema que recomiendo arriba para descargar toda la autenticación a un "Proveedor de Identidad Federada / STS" para que su código sea no está estrechamente acoplado a la autenticación, y para que pueda agregar nuevos "Proveedores de identidad" y "transformaciones de reclamaciones" al STS federado en el futuro sin ningún cambio de código.

respondido por el Greg Thatcher 12.10.2016 - 23:18
fuente

Lea otras preguntas en las etiquetas