mobile - source - openid oauth
¿Qué flujo de autorización de OpenID Connect para autenticar usuarios de aplicaciones móviles? (3)
Creo que el flujo híbrido de la especificación de OpenID Connect es probablemente el que desea utilizar. OpenID Connect Core Spec .
Esto depende de tener un URI de retorno configurado, pero como James dice que usaría un esquema de URI personalizado para permitir que el SO móvil redirija después de iniciar sesión en su propia aplicación. Su aplicación tendría un código de acceso que puede usar para obtener tokens de acceso según sea necesario (suponiendo que esté usando Oauth2 para proteger sus servicios de API de back-end que utiliza la aplicación móvil).
Existe una vulnerabilidad que permitiría a una aplicación malintencionada secuestrar su esquema de URI y tomar los tokens. Hay un borrador de especificación para superar esa Clave de prueba para el intercambio de código por parte de los clientes públicos de OAuth que vale la pena considerar su implementación.
Estoy creando una aplicación móvil multiplataforma que interactúa con una API RESTful, y quiero usar OpenID Connect para autenticar a mis usuarios. Estaré construyendo mi propio servidor proveedor de OpenID Connect.
OpenID.net claims que:
OpenID Connect permite a los clientes de todos los tipos, incluido JavaScript basado en navegador y aplicaciones móviles nativas, lanzar flujos de inicio de sesión y recibir afirmaciones verificables sobre la identidad de los usuarios registrados.
Sin embargo, no puedo encontrar ninguna documentación que explique cómo autenticar realmente para un cliente de aplicaciones móviles.
Esta respuesta de StackExchange deja claro que OpenID Connect no es compatible con el flujo de "concesión de contraseña basada en contraseña del propietario del recurso" o el flujo de "credenciales de cliente".
Eso solo deja el flujo de "código de autorización" (normalmente utilizado por las aplicaciones del lado del servidor) y el flujo de "concesión implícita" (normalmente utilizado por las aplicaciones del lado del cliente). Ambos parecen depender de la redirección del usuario al punto final de autorización del proveedor y de que el proveedor redireccione nuevamente a la URL del cliente. No veo cómo esto puede aplicarse a una aplicación móvil.
¿Puede alguien explicarme (o incluso mejor, señalarme un tutorial o algún código de ejemplo) que explique cómo hacer esto?
Actualizar
Para aclarar: OpenID Connect se basa en que el cliente redirige al usuario al punto final de autorización, y luego el proveedor redirige al usuario de nuevo al cliente. En el caso de que el cliente no sea una aplicación web, ¿cómo puede funcionar esto?
Echa un vistazo al proyecto MITREid en github:
MITREid Connect
Este proyecto contiene una implementación de referencia de OpenID Connect en Java en la plataforma Spring, que incluye una biblioteca de servidores en funcionamiento, un paquete de servidores implementables, una biblioteca de clientes (RP) y bibliotecas de utilidades generales. El servidor se puede utilizar como un proveedor de identidades de OpenID Connect, así como un servidor de autorización OAuth 2.0 de propósito general.
Las aplicaciones móviles, al menos en iOS y Android, pueden registrar esquemas de URL personalizados, de modo que una redirección desde un navegador puede enviar al usuario a su aplicación junto con algunos parámetros de consulta.
Por lo tanto, puede usar estos flujos en una aplicación móvil nativa, pero implica enviar al usuario a un navegador web (ya sea una aplicación de navegador externo o una vista web incorporada en su aplicación) para que se autentiquen con el OP.
Sin embargo, mi opinión sobre este enfoque general es que, dado que está desarrollando su propio servidor OP y su propia aplicación móvil nativa, la aplicación móvil es realmente un cliente confiable y no hay nada de malo en que los usuarios ingresen directamente su nombre de usuario y contraseña en su aplicación. . Quizás entiendo por qué esto no es compatible con la especificación de OpenID Connect porque no es realmente el problema que OIDC está tratando de resolver, y podría alentar a las aplicaciones de terceros a solicitar a los usuarios que ingresen su nombre de usuario y contraseña directamente. Sin embargo, me gustaría que hubiera más orientación sobre este tema en la especificación, ya que me enfrento a un escenario similar al suyo y no estoy seguro de cómo proceder.