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
Le flux d'autorisation d'octroi implicite OAuth 2.0 (défini dans la section 4.2 de OAuth 2.0 [RFC6749]) fonctionne généralement avec la pratique consistant à exécuter la demande d'autorisation dans le navigateur et à recevoir la réponse d'autorisation via une communication inter-application basée sur l'URI.
Cependant, comme le flux implicite ne peut pas être protégé par PKCE [RFC7636] (qui est requis dans la section 8.1), l'utilisation du flux implicite avec des applications natives n'est PAS RECOMMANDÉE .
Les jetons d'accès accordés via le flux implicite ne peuvent pas non plus être actualisés sans interaction de l'utilisateur, ce qui fait du flux d'octroi de code d'autorisation - qui peut émettre des jetons d'actualisation - l'option la plus pratique pour les autorisations d'applications natives qui nécessitent l'actualisation des jetons d'accès.
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/
Le flux d'octroi de code d'autorisation est recommandé pour les applications qui disposent d'un service Web. Ce flux nécessite une communication de serveur à serveur à l'aide du secret client d'une application.
Remarque: ne placez jamais votre secret client dans un code distribué, tel que des applications téléchargées via un magasin d'applications ou JavaScript côté client.
Les applications qui n'ont pas de service Web doivent utiliser le flux d'octroi implicite.
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
La meilleure pratique actuelle du secteur consiste à utiliser le flux d'autorisation tout en omettant le secret client et à utiliser un agent utilisateur externe pour terminer le flux. Un agent utilisateur externe est généralement le navigateur natif de l'appareil (avec un domaine de sécurité distinct de l'application native) afin que l'application ne puisse pas accéder au stockage des cookies ou inspecter ou modifier le contenu de la page dans le navigateur.
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
- Autorisez les clients à enregistrer des schémas d'URL personnalisés pour leurs URL de redirection.
- Prend en charge les URL de redirection IP de bouclage avec des numéros de port arbitraires afin de prendre en charge les applications de bureau.
- Ne supposez pas que les applications natives peuvent garder un secret. Exiger de toutes les applications qu'elles déclarent si elles sont publiques ou confidentielles et ne délivrer des secrets clients qu'aux applications confidentielles.
- Prend en charge l'extension PKCE et exige que les clients publics l'utilisent.
- Essayez de détecter le moment où l'interface d'autorisation est intégrée dans la vue Web d'une application native, au lieu d'être lancée dans un navigateur système, et rejetez ces demandes.
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
Toute tentative d'intégration de la page d'authentification OAuth 2.0 entraînera l'interdiction de votre application de l'API Fitbit.
Pour des raisons de sécurité, la page d'autorisation OAuth 2.0 doit être présentée dans une vue de navigateur dédiée. Les utilisateurs de Fitbit ne peuvent confirmer qu'ils s'authentifient auprès du site Fitbit.com authentique que s'ils disposent des outils fournis par le navigateur, tels que la barre d'URL et les informations de certificat Transport Layer Security (TLS).
Pour les applications natives, cela signifie que la page d'autorisation doit s'ouvrir dans le navigateur par défaut. Les applications natives peuvent utiliser des schémas d'URL personnalisés comme URI de redirection pour rediriger l'utilisateur du navigateur vers l'application qui demande l'autorisation.
Les applications iOS peuvent utiliser la classe SFSafariViewController au lieu de basculer vers Safari. L'utilisation de la classe WKWebView ou UIWebView est interdite.
Les applications Android peuvent utiliser les onglets personnalisés de Chrome au lieu de basculer vers le navigateur par défaut. L'utilisation de WebView est interdite.
Pour clarifier davantage, voici une citation de cette section d'un projet précédent du lien des meilleures pratiques fourni ci-dessus
Les agents utilisateurs intégrés, généralement mis en œuvre avec des vues Web, sont une méthode alternative pour autoriser des applications natives. Ils sont cependant dangereux pour une utilisation par des tiers par définition. Ils impliquent que l'utilisateur se connecte avec ses informations de connexion complètes, uniquement pour les faire passer à des informations d'identification OAuth moins puissantes.
Même lorsqu'ils sont utilisés par des applications propriétaires de confiance, les agents utilisateurs intégrés violent le principe du moindre privilège en obtenant des informations d'identification plus puissantes que ce dont ils ont besoin, augmentant potentiellement la surface d'attaque.
Dans les implémentations typiques basées sur la vue Web des agents utilisateurs intégrés, l'application hôte peut: enregistrer chaque frappe saisie dans le formulaire pour capturer les noms d'utilisateur et les mots de passe; soumettre automatiquement des formulaires et contourner le consentement de l'utilisateur; copiez les cookies de session et utilisez-les pour effectuer des actions authentifiées en tant qu'utilisateur.
En encourageant les utilisateurs à entrer leurs informations d'identification dans une vue Web intégrée sans la barre d'adresse habituelle et les autres fonctionnalités d'identité des navigateurs, il est impossible pour l'utilisateur de savoir s'il se connecte au site légitime, et même lorsqu'ils le sont, cela les forme qu'il est OK pour entrer les informations d'identification sans valider le site au préalable.
Outre les problèmes de sécurité, les vues Web ne partagent pas l'état d'authentification avec d'autres applications ou le navigateur système, ce qui oblige l'utilisateur à se connecter pour chaque demande d'autorisation et entraîne une mauvaise expérience utilisateur.
En raison de ce qui précède, l'utilisation d'agents utilisateurs intégrés n'est PAS RECOMMANDÉE, sauf lorsqu'une application propriétaire de confiance agit en tant qu'agent utilisateur externe pour d'autres applications ou fournit une authentification unique pour plusieurs applications propriétaires.
Les serveurs d'autorisation DEVRAIENT envisager de prendre des mesures pour détecter et bloquer les connexions via des agents utilisateurs intégrés qui ne sont pas les leurs, dans la mesure du possible.
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