Pour utiliser l'api de Google Drive, je dois jouer avec l'authentification en utilisant OAuth2.0. Et j'ai quelques questions à ce sujet.
L'identifiant client et le secret client sont utilisés pour identifier ce qu'est mon application. Mais ils doivent être codés en dur s'il s'agit d'une application cliente. Ainsi, tout le monde peut décompiler mon application et les extraire du code source. Cela signifie-t-il qu'une mauvaise application peut prétendre être une bonne application en utilisant l'identifiant client et le secret de la bonne application? Donc, l'utilisateur afficherait un écran demandant d'accorder l'autorisation à une bonne application même si elle est en fait demandée par une mauvaise application? Si oui, que dois-je faire? Ou en fait je ne devrais pas m'inquiéter à ce sujet?
Dans l'application mobile, nous pouvons intégrer une vue Web à notre application. Et il est facile d'extraire le champ du mot de passe dans la vue Web, car l'application qui demande l'autorisation est en fait un "navigateur". Ainsi, OAuth dans une application mobile n'a pas l'avantage que l'application cliente n'a pas accès aux informations d'identification de l'utilisateur du fournisseur de services?
Réponses:
J'ai commencé à écrire un commentaire à votre question, mais j'ai découvert qu'il y avait trop de choses à dire, alors voici mon point de vue sur le sujet dans la réponse.
Oui, il y a une réelle possibilité pour cela et il y a eu quelques exploits basés sur cela. Il est suggéré de ne pas garder l'application secrète dans votre application, il y a même une partie de la spécification selon laquelle les applications distribuées ne devraient pas utiliser ce jeton. Maintenant, vous pourriez demander, mais XYZ en a besoin pour fonctionner. Dans ce cas, ils n'implémentent pas correctement les spécifications et vous devez A ne pas utiliser ce service (peu probable) ou B essayer de sécuriser le jeton en utilisant des méthodes obscurcissantes pour rendre plus difficile la recherche ou l'utilisation de votre serveur comme proxy.
Par exemple, il y avait des bogues dans la bibliothèque Facebook pour Android où il y avait une fuite de jetons vers Logs, vous pouvez en savoir plus à ce sujet ici http://attack-secure.com/all-your-facebook-access-tokens-are-belong -à-nous et ici https://www.youtube.com/watch?v=twyL7Uxe6sk . Dans l'ensemble, soyez très prudent quant à votre utilisation des bibliothèques tierces (le bon sens en fait, mais si le détournement de jetons est votre grande préoccupation, ajoutez un autre supplément à la prudence).
Je discute du point 2 depuis un certain temps. J'ai même fait des solutions de contournement dans mes applications afin de modifier les pages de consentement (par exemple en changeant le zoom et la conception pour s'adapter à l'application) mais rien ne m'empêchait de lire les valeurs des champs de la vue Web avec nom d'utilisateur et mot de passe. Par conséquent, je suis totalement d'accord avec votre deuxième point et je trouve qu'il s'agit d'un gros "bug" dans les spécifications OAuth. Le fait que "l'application n'accède pas aux identifiants des utilisateurs" dans la spécification est juste un rêve et donne aux utilisateurs un faux sentiment de sécurité… De plus, je suppose que les gens sont généralement soupçonnés lorsque l'application leur demande leur Facebook, Twitter, Dropbox ou d'autres identifiants. Je doute que beaucoup de gens ordinaires lisent les spécifications OAuth et disent "Maintenant, je suis en sécurité", mais utilisent plutôt le bon sens et n'utilisent généralement pas d'applications auxquelles ils ne font pas confiance.
la source
J'avais la même question que la question 1 ici, et j'ai fait des recherches moi-même récemment, et ma conclusion est qu'il est normal de ne pas garder le «secret du client» secret. Le type de clients qui ne gardent pas la confidentialité du client secret est appelé «client public» dans la spécification OAuth2. La possibilité qu'une personne malveillante puisse obtenir un code d'autorisation, puis un jeton d'accès, est empêchée par les faits suivants.
1. Le client doit obtenir le code d'autorisation directement de l'utilisateur, pas du service
Même si l'utilisateur indique au service qu'il fait confiance au client, le client ne peut pas obtenir le code d'autorisation du service simplement en affichant l'ID client et le secret client. Au lieu de cela, le client doit obtenir le code d'autorisation directement de l'utilisateur. (Cela se fait généralement par redirection d'URL, dont je parlerai plus tard.) Donc, pour le client malveillant, il ne suffit pas de connaître l'ID / secret client de confiance de l'utilisateur. Il doit en quelque sorte impliquer ou usurper l'utilisateur pour lui donner le code d'autorisation, ce qui devrait être plus difficile que de simplement connaître l'ID / le secret du client.
2. L'URL de redirection est enregistrée avec l'ID / secret client
Supposons que le client malveillant ait réussi à impliquer l'utilisateur et à lui faire cliquer sur le bouton "Autoriser cette application" sur la page de service. Cela déclenchera la réponse de redirection d'URL du service vers le navigateur de l'utilisateur avec le code d'autorisation. Ensuite, le code d'autorisation sera envoyé du navigateur de l'utilisateur à l'URL de redirection, et le client est censé écouter l'URL de redirection pour recevoir le code d'autorisation. (L'URL de redirection peut également être localhost, et j'ai pensé que c'était une manière typique qu'un «client public» reçoive le code d'autorisation.) Puisque cette URL de redirection est enregistrée au service avec l'ID / secret client, le client malveillant ne avoir un moyen de contrôler où le code d'autorisation est donné.
la source
Réponse à la 2ème question: les API Google pour des raisons de sécurité exigent que l'authentification / connexion ne puisse pas être effectuée dans l'application elle-même (comme les vues Web ne sont pas autorisées) et doit être effectuée en dehors de l'application à l'aide du navigateur pour une meilleure sécurité, ce qui est expliqué plus en détail ci-dessous: https: //developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html
la source