J'essaie de mettre en œuvre une autorisation incrémentielle avec Google Oauth2 dans mon application.
Au début, lorsque les utilisateurs se connectent, l'application demande des étendues et un accès hors connexion. Je génère et stocke le refreshToken dans ma base de données afin de pouvoir actualiser les jetons d'accès pour effectuer des appels API en cas de besoin.
Je vais maintenant implémenter une nouvelle fonctionnalité qui demandera une nouvelle portée, mais je voudrais demander cette portée uniquement si les utilisateurs essaient d'utiliser cette nouvelle fonctionnalité.
Le problème auquel je suis confronté est que, lorsque l'application invite les utilisateurs à consentir à une nouvelle étendue, Google demande l'accès à toutes les étendues précédemment acceptées.
J'ai essayé sans accès hors ligne (en utilisant la méthode «Grant» ) et cela semble fonctionner (comme la description dit «Demander des portées supplémentaires à l'utilisateur»). Pour ce faire, Google ne demande qu'une nouvelle portée et le jeton d'accès généré semble fonctionner correctement. Mais si j'essaie avec un accès hors ligne (en utilisant la méthode 'grantOfflineAccess' ), Google demande toutes les portées. Si j'accepte à nouveau toutes les étendues, cela renvoie un code d'autorisation et je peux générer à nouveau le refreshToken, mais je voudrais le faire en n'acceptant que la nouvelle étendue.
Je me demandais peut-être qu'il n'était pas possible de le faire lors de la demande d'accès hors ligne, car vous devez générer un nouveau refreshToken avec toutes les étendues, mais je n'ai trouvé aucune information à ce sujet.
Est-ce que je fais quelque chose de mal ou n'est-il pas possible d'y parvenir avec un accès hors ligne?
MISE À JOUR : En générant également l'URL (au lieu d'utiliser la bibliothèque JS) comme expliqué ici , Google demande toutes les portées. Ce serait un exemple de l'URL générée:
https://accounts.google.com/o/oauth2/v2/auth?
scope=my_new_scope&
redirect_uri=https://myapp.example.com/callback&
response_type=code&
client_id=my_client_id&
prompt=consent&
include_granted_scopes=true
UPDATE2 : J'ai trouvé un problème signalé ici , où quelqu'un a commenté qu'il n'est pas possible de le faire pour les applications installées. Mais il y a un commentaire expliquant comment le faire avec le flux de serveur Web, voici les étapes à l'aide du terrain de jeu OAuth2 ( https://developers.google.com/oauthplayground ):
1) Sélectionnez la portée de Google Agenda.
2) Autoriser l'accès
3) Échangez le code contre le jeton.
4) Faites une demande au point de terminaison des informations de jeton: https://www.googleapis.com/oauth2/v2/tokeninfo?access_token= ...
5) Vérifiez que le jeton contient uniquement la portée de Google Agenda.
6) Désélectionnez la portée de Google Agenda et sélectionnez la portée de Google Drive.
7) Modifiez l'URL dans la fenêtre d'autorisation et ajoutez & include_granted_scopes = true.
8) Autorisez l'oscilloscope Drive.
9) Échangez le code contre un jeton.
10) Faites une demande au point de terminaison d'informations de jeton.
11) Vérifiez qu'il contient à la fois les étendues de calendrier et de lecteur.
En faisant de même, j'obtiens la portée du calendrier dans la première vérification et la portée de Drive dans la seconde. Même en utilisant le jeton d'actualisation, je ne peux pas obtenir de jeton d'accès avec les deux étendues. Après cela, et c'est assez étrange, j'ai vérifié les applications avec accès à mon compte et le terrain de jeu OAuth2 a les deux étendues:
Merci d'avance!
J'ai enfin réussi à implémenter l'autorisation incrémentielle à l'aide de la bibliothèque JS. En utilisant la fonction grantOfflineAccess, vous pouvez envoyer les nouvelles étendues que vous souhaitez demander. Par défaut, include_granted_scopes a la valeur true lorsque vous utilisez gapi.auth2.authorize .
Il vous suffit donc d'envoyer les nouvelles étendues, par exemple:
GoogleUser.grantOfflineAccess({scope: 'https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/calendar'}
Ensuite, vous recevrez un code d'autorisation à échanger contre un refreshToken. Vous pouvez vérifier que tout fonctionne en générant un access_token avec le nouveau refreshToken et en appelant le point de terminaison d'informations de jeton: https://www.googleapis.com/oauth2/v2/tokeninfo?access_token= ...
Je suis sûr que c'est quelque chose que j'ai essayé au début, alors je suppose que je faisais quelque chose de mal.
Quoi qu'il en soit, j'ai décidé de ne pas utiliser d'autorisation incrémentielle en raison d' un problème avec la bibliothèque . Fondamentalement, le problème est que, pour une meilleure expérience utilisateur et pour éviter les problèmes, vous devriez pouvoir l'utiliser prompt: 'consent'
afin que l'utilisateur n'ait pas besoin de sélectionner un compte pour accepter de nouvelles étendues. Mais ce n'est pas possible et vous pourriez avoir des problèmes si les utilisateurs sélectionnent différents comptes pour accepter différentes étendues de votre application.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots