Google OAuth 2.0 - Autorisation incrémentielle avec accès hors connexion

Ruben Lopez

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:

entrez la description de l'image ici

Merci d'avance!

Ruben Lopez

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.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Autorisation incrémentielle pour la connexion à Google OAuth2 avec Spring Security

Connexion à Discord oAuth2 après l'autorisation

Ignorer l'autorisation d'accès hors connexion dans l'autorisation Microsoft OIDC

API Spring RESTful sécurisée avec serveur d'autorisation Google OAuth2

Autorisation dans Google avec utilisation d'OAuth 2 sans navigateur

Autorisation non interactive avec Google OAuth2

Mon application demande l'autorisation "Avoir un accès hors connexion", pourquoi?

Connexion Spring Security OAuth2 avec Google

La connexion Google OAuth2 demande toujours les autorisations d'accès des utilisateurs

Comment faire une séquence incrémentielle avec java dans Apache-Spark 2.x

API de connexion javascript Google: pas d'accès hors connexion

Accès non configuré pour la connexion à Google OAUTH

Azure avec OAuth 2 - informations de connexion google + et bouton de déconnexion

Annuler l'autorisation google OAuth2

Comment stocker un objet client Google Api (tableau access_token) avec un accès hors connexion et le réutiliser

Outlook API OAuth2 accès hors ligne / accès permanent à l'aide de php

Comment retourner le jeton d'accès lors de la connexion avec oauth2 dans drf?

Connexion à Google Compute Engine avec Oauth

Type d'accès de configuration de Laravel socialite comme hors ligne dans la connexion Google

Séquence incrémentielle d'Oracle à HDFS avec condition

Autorisation Firebase 3 refusée après la première connexion avec Google, fonctionne après la deuxième fois

Autorisation Xero oAuth 2

Ignorer la page d'autorisation avec oAuth 2 et FOSOAuthServerBundle

Serveur d'autorisation Oauth2 personnalisé - AccessDeniedException : l'accès est refusé

Autorisation Google OAuth 2 - Erreur: redirect_uri_mismatch

Accès hors connexion PHP à l'API Google, "invalid_grant: le code a déjà été utilisé"

Stratégie Passport.js / Google OAuth2 - Comment utiliser le jeton lors de la connexion pour l'accès à l'API

Connexion réussie à Spring OAuth2 avec des autorités vides

Connexion Reactjs Google OAuth avec interface utilisateur personnalisée

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  3. 3

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  4. 4

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Exporter la table de l'arborescence vers CSV avec mise en forme

  7. 7

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  8. 8

    Créer un système Buzzer à l'aide de python

  9. 9

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  10. 10

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  11. 11

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  12. 12

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  13. 13

    Conversion double en BigDecimal en Java

  14. 14

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  15. 15

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  18. 18

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  19. 19

    comment afficher un bouton au-dessus d'un autre élément ?

  20. 20

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  21. 21

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

chaudétiquette

Archive