J'essaie d'implémenter l'autorisation déléguée dans une API Web pour les applications mobiles utilisant OAuth 2.0. Selon les spécifications, le flux d'octroi implicite ne prend pas en charge les jetons d'actualisation, ce qui signifie qu'une fois qu'un jeton d'accès est accordé pour une période de temps spécifique, l'utilisateur doit à nouveau accorder des autorisations à l'application une fois que le jeton expire ou qu'il est révoqué.
Je suppose que c'est un bon scénario pour un code javascript fonctionnant sur un navigateur, comme mentionné dans la spécification. J'essaie de minimiser les temps pendant lesquels l'utilisateur doit accorder des autorisations à l'application pour obtenir un jeton, il semble donc que le flux de code d'autorisation soit une bonne option car il prend en charge les jetons d'actualisation.
Cependant, ce flux semble dépendre fortement d'un navigateur Web pour effectuer les redirections. Je me demande si ce flux est toujours une bonne option pour une application mobile si un navigateur Web intégré est utilisé. Ou devrais-je suivre le flux implicite?
Réponses:
Clarification: application mobile = application native
Comme indiqué dans d'autres commentaires et dans quelques sources en ligne, l'implicite semble être une solution naturelle pour les applications mobiles, mais la meilleure solution n'est pas toujours claire (et en fait, implicite n'est pas recommandée pour les raisons exposées ci-dessous).
Bonnes pratiques OAuth2 pour les applications natives
Quelle que soit l'approche que vous choisissez (il y a quelques compromis à considérer), vous devez faire attention aux meilleures pratiques décrites ici pour les applications natives utilisant OAuth2: https://tools.ietf.org/html/rfc8252
Considérez les options suivantes
Implicite
Dois-je utiliser implicite?
Pour citer la section 8.2 https://tools.ietf.org/html/rfc8252#section-8.2
Code d'autorisation
Si vous optez pour le code d'autorisation, une approche consisterait à utiliser le proxy via votre propre composant de serveur Web qui enrichit les demandes de jetons avec le secret client pour éviter de le stocker sur l'application distribuée sur les appareils.
Extrait ci-dessous de: https://dev.fitbit.com/docs/oauth2/
Conclusion
La décision finale doit prendre en compte l'expérience utilisateur souhaitée, mais aussi votre appétit pour le risque après avoir effectué une évaluation des risques appropriée de vos approches présélectionnées et une meilleure compréhension des implications.
Une bonne lecture est ici https://auth0.com/blog/oauth-2-best-practices-for-native-apps/
Un autre est https://www.oauth.com/oauth2-servers/oauth-native-apps/ qui indique
Considération PKCE
Vous devriez également considérer PKCE qui est décrit ici https://www.oauth.com/oauth2-servers/pkce/
Plus précisément, si vous implémentez également le serveur d'autorisation, https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/ indique que vous devez
Prise en compte des vues Web
Il existe de nombreux exemples dans la nature utilisant des vues Web, c'est-à-dire un agent utilisateur intégré, mais cette approche doit être évitée (en particulier lorsque l'application n'est pas la première partie) et dans certains cas, elle peut vous interdire d'utiliser une API comme extrait ci-dessous à partir d' ici montre
Pour clarifier davantage, voici une citation de cette section d'un projet précédent du lien des meilleures pratiques fourni ci-dessus
Quelques points intéressants sont également soulevés ici: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- une
la source
Malheureusement, je ne pense pas qu'il y ait une réponse claire à cette question. Cependant, voici les options que j'ai identifiées:
Si vous pouvez demander à l'utilisateur ses informations d'identification, utilisez les informations d'identification du mot de passe du propriétaire de la ressource . Cependant, cela peut ne pas être possible pour certaines raisons, à savoir
Si l'utilisation d'un flux basé sur un navigateur est requise, utilisez le flux de code d'autorisation . Ici, la définition du
redirect_uri
est un enjeu majeur, pour lequel il existe les options suivantes:redirect_uri
(par exempleurn:ietf:wg:oauth:2.0:oob
) signale au point de terminaison d'autorisation d'afficher le code d'autorisation au lieu de rediriger vers l'application cliente. L'utilisateur peut copier manuellement ce code ou l'application peut essayer de l'obtenir à partir du titre du document HTML.localhost
serveur sur l'appareil (la gestion des ports peut ne pas être facile).myapp://...
) qui, lorsqu'il est déréférencé, déclenche un «gestionnaire» enregistré (les détails dépendent de la plate-forme mobile).J'espère que cela t'aides
Pedro
la source
TL; DR: Utiliser l'octroi de code d'autorisation avec PKCE
1. Type de subvention implicite
Le type de subvention implicite est très populaire avec les applications mobiles. Mais il n'était pas destiné à être utilisé comme ça. Il y a des problèmes de sécurité autour de la redirection. Justin Richer déclare :
Et avec le fait qu'il ne vous permet pas d'actualiser le jeton d'accès, mieux vaut l'éviter.
2. Type d'autorisation de code d'autorisation
L'octroi du code d'autorisation nécessite un secret client. Mais vous ne devez pas stocker d'informations sensibles dans le code source de votre application mobile. Les gens peuvent les extraire. Pour ne pas exposer le secret client, vous devez exécuter un serveur en tant qu'intermédiaire pendant que Facebook écrit :
Ce n'est pas une solution idéale, mais il y a une nouvelle, une meilleure façon de faire OAuth sur les appareils mobiles: Clé de preuve pour l'échange de code
3. Type d'octroi de code d'autorisation avec PKCE (clé de preuve pour l'échange de code)
En dehors des limitations, une nouvelle technique a été créée qui vous permet d'utiliser le code d'autorisation sans secret client. Vous pouvez lire la RFC 7636 complète ou cette courte introduction .
sur https://oauth.net/2/pkce/
la source
L'utilisation d'une vue Web dans votre application mobile devrait être un moyen abordable d'implémenter le protocole OAuth2.0 sur la plate-forme Android.
En ce qui concerne le champ redirect_uri, je pense que
http://localhost
c'est un bon choix et que vous n'avez pas à porter un serveur HTTP dans votre application, car vous pouvez remplacer l'implémentation de laonPageStarted
fonction dans laWebViewClient
classe et arrêter le chargement de la page Webhttp://localhost
après avoir vérifié leurl
paramètre.la source
L'expérience utilisateur la plus fluide pour l'authentification et la plus simple à mettre en œuvre consiste à intégrer une vue Web dans votre application. Traitez les réponses reçues par la vue Web à partir du point d'authentification et détectez l'erreur (annulation de l'utilisateur) ou l'approbation (et extrayez le jeton des paramètres de requête d'URL). Et je pense que vous pouvez le faire sur toutes les plateformes. J'ai réussi à faire ce travail pour les éléments suivants: iOS, Android, Mac, applications Windows Store 8.1, application Windows Phone 8.1. Je l'ai fait pour les services suivants: dropbox, google drive, onedrive, box, basecamp. Pour les plates-formes non Windows, j'utilisais Xamarin, qui n'exposait pas toutes les API spécifiques à la plate-forme, mais il en a exposé suffisamment pour rendre cela possible. C'est donc une solution assez accessible, même d'un point de vue multiplateforme, et vous ne le faites pas.
la source