Estoy intentando implementar la autorización delegada en una API web para aplicaciones móviles usando OAuth 2.0. Según la especificación, el flujo de concesión implícito no admite tokens de actualización, lo que significa que una vez que se otorga un token de acceso durante un período de tiempo específico, el usuario debe otorgar permisos a la aplicación nuevamente una vez que el token expira o se revoca.
Supongo que este es un buen escenario para algún código javascript que se ejecuta en un navegador, como se menciona en la especificación. Estoy tratando de minimizar las veces que el usuario debe otorgar permisos a la aplicación para obtener un token, por lo que parece que el flujo del Código de autorización es una buena opción, ya que admite tokens de actualización.
Sin embargo, este flujo parece depender en gran medida de un navegador web para realizar las redirecciones. Me pregunto si este flujo sigue siendo una buena opción para una aplicación móvil si se utiliza un navegador web integrado. ¿O debería seguir el flujo implícito?
Respuestas:
Aclaración: Aplicación móvil = Aplicación nativa
Como se indica en otros comentarios y en algunas fuentes en línea, lo implícito parece un ajuste natural para las aplicaciones móviles, sin embargo, la mejor solución no siempre es clara (y de hecho, lo implícito no se recomienda por las razones que se analizan a continuación).
Prácticas recomendadas de OAuth2 para aplicaciones nativas
Cualquiera que sea el enfoque que elija (hay algunas compensaciones a considerar), debe prestar atención a las mejores prácticas que se describen aquí para las aplicaciones nativas que usan OAuth2: https://tools.ietf.org/html/rfc8252
Considere las siguientes opciones
Implícito
¿Debo usar implícito?
Para citar de la Sección 8.2 https://tools.ietf.org/html/rfc8252#section-8.2
Código de Autorización
Si opta por el Código de autorización, entonces un enfoque sería utilizar un proxy a través de su propio componente de servidor web que enriquece las solicitudes de token con el secreto del cliente para evitar almacenarlo en la aplicación distribuida en los dispositivos.
Extracto a continuación de: https://dev.fitbit.com/docs/oauth2/
Conclusión
La decisión final debe tener en cuenta su experiencia de usuario deseada, pero también su apetito por el riesgo después de realizar una evaluación de riesgo adecuada de los enfoques seleccionados y comprender mejor las implicaciones.
Una gran lectura está aquí https://auth0.com/blog/oauth-2-best-practices-for-native-apps/
Otro es https://www.oauth.com/oauth2-servers/oauth-native-apps/ que dice
Consideración PKCE
También debe considerar PKCE que se describe aquí https://www.oauth.com/oauth2-servers/pkce/
Específicamente, si también está implementando el servidor de autorización, https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/ indica que debe
Consideración de vistas web
Hay muchos ejemplos en la naturaleza que usan vistas web, es decir, un agente de usuario integrado, pero este enfoque debe evitarse (especialmente cuando la aplicación no es propia) y, en algunos casos, puede resultar en que se le prohíba el uso de una API como extracto abajo de aquí demuestra
Para aclarar aún más, aquí hay una cita de esta sección de un borrador anterior del enlace de mejores prácticas proporcionado anteriormente.
Aquí también se plantean algunos puntos interesantes: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- una
fuente
Desafortunadamente, no creo que haya una respuesta clara a esta pregunta. Sin embargo, estas son las opciones que he identificado:
Si está bien pedirle al usuario sus credenciales, utilice las Credenciales de contraseña del propietario del recurso . Sin embargo, esto puede no ser posible por algunas razones, a saber
Si se requiere el uso de un flujo basado en navegador, utilice el flujo de código de autorización . Aquí, la definición de
redirect_uri
es un gran desafío, para el cual existen las siguientes opciones:redirect_uri
(p. Ej.urn:ietf:wg:oauth:2.0:oob
. ) Indica al extremo de autorización que muestre el código de autorización en lugar de redirigirlo a la aplicación cliente. El usuario puede copiar manualmente este código o la aplicación puede intentar obtenerlo del título del documento HTML.localhost
servidor en el dispositivo (la gestión de puertos puede no ser fácil).myapp://...
) que cuando se desreferencia activa un "controlador" registrado (los detalles dependen de la plataforma móvil).Espero que esto ayude
Pedro
fuente
TL; DR: Use la concesión del código de autorización con PKCE
1. Tipo de subvención implícita
El tipo de subvención implícita es bastante popular entre las aplicaciones móviles. Pero no estaba destinado a usarse así. Existen preocupaciones de seguridad en torno a la redirección. Justin Richer afirma :
Y junto con el hecho de que no te deja refrescar el token de acceso, mejor evitarlo.
2. Código de autorización Tipo de concesión
La concesión del código de autorización requiere un secreto de cliente. Pero no debe almacenar información confidencial en el código fuente de su aplicación móvil. La gente puede extraerlos. Para no exponer el secreto del cliente, debe ejecutar un servidor como intermediario como Facebook escribe :
No es una solución ideal, pero hay una manera nueva y mejor de hacer OAuth en dispositivos móviles: clave de prueba para intercambio de código
3. Tipo de concesión de código de autorización con PKCE (clave de prueba para intercambio de código)
Fuera de las limitaciones, se creó una nueva técnica que le permite usar el Código de autorización sin un secreto de cliente. Puede leer el RFC 7636 completo o esta breve introducción .
de https://oauth.net/2/pkce/
fuente
El uso de una vista web en su aplicación móvil debería ser una forma asequible de implementar el protocolo OAuth2.0 en la plataforma Android.
En cuanto al campo redirect_uri, creo que
http://localhost
es una buena opción y no tiene que portar un servidor HTTP dentro de su aplicación, porque puede anular la implementación de laonPageStarted
función en laWebViewClient
clase y dejar de cargar la página webhttp://localhost
después de verificar elurl
parámetro.fuente
La experiencia de usuario más fluida para la autenticación y la más fácil de implementar es incrustar una vista web en su aplicación. Procese las respuestas recibidas por la vista web desde el punto de autenticación y detecte el error (cancelación del usuario) o la aprobación (y extraiga el token de los parámetros de consulta de la URL). Y creo que puedes hacerlo en todas las plataformas. He logrado que esto funcione para lo siguiente: ios, android, mac, aplicaciones de Windows Store 8.1, aplicación de Windows Phone 8.1. Hice esto para los siguientes servicios: dropbox, google drive, onedrive, box, basecamp. Para las plataformas que no son de Windows, estaba usando Xamarin, que supuestamente no expone todas las API específicas de la plataforma, pero sí expone lo suficiente para hacer esto posible. Así que es una solución bastante accesible, incluso desde una perspectiva multiplataforma, y no
fuente