Je souhaite obtenir le jeton d'accès de Google. L'API Google indique que pour obtenir le jeton d'accès, envoyez le code et d'autres paramètres à la page de génération de jeton, et la réponse sera un objet JSON comme:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
Cependant, je ne reçois pas le jeton d'actualisation. La réponse dans mon cas est:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
gdata
gdata-api
access-token
Muhammad Usman
la source
la source
Réponses:
Le
refresh_token
n'est fourni qu'à la première autorisation de l'utilisateur. Les autorisations suivantes, telles que celles que vous effectuez lors du test d'une intégration OAuth2, ne renverrontrefresh_token
plus. :)refresh_token
(à condition qu'il comprenne également le paramètre de requête «access_type = offline».Vous pouvez également ajouter les paramètres de requête
prompt=consent&access_type=offline
à la redirection OAuth (voir la page OAuth 2.0 de Google pour les applications de serveur Web ).Cela invitera l'utilisateur à autoriser à nouveau l'application et renverra toujours a
refresh_token
.la source
access_type=offline
dans tous les cas quand vous le souhaitezrefresh_token
.$client->setAccessType('offline')
. Lefunction setApprovalPrompt()
est déjà transmisforce
par défaut.Pour obtenir le jeton d'actualisation, vous devez ajouter les deux
approval_prompt=force
etaccess_type="offline"
si vous utilisez le client java fourni par Google, il ressemblera à ceci:la source
J'ai cherché une longue nuit et ça fait l'affaire:
User-example.php modifié depuis admin-sdk
puis vous obtenez le code à l'URL de redirection et l'authentification avec le code et obtenir le jeton d'actualisation
Vous devriez le stocker maintenant;)
Lorsque votre clé d'accès expire, faites
la source
Cela m'a causé une certaine confusion, alors j'ai pensé partager ce que je venais d'apprendre à la dure:
Lorsque vous demandez l'accès à l'aide des paramètres
access_type=offline
etapproval_prompt=force
, vous devez recevoir à la fois un jeton d' accès et un jeton d' actualisation . L' accès jeton d' expire peu de temps après sa réception et vous devrez le rafraîchir.Vous avez correctement fait la demande pour obtenir un nouveau jeton d' accès et reçu la réponse contenant votre nouveau jeton d' accès . J'ai également été troublé par le fait que je n'ai pas reçu de nouveau jeton d' actualisation . Cependant, c'est ainsi que cela doit être puisque vous pouvez utiliser le même rafraîchissement jeton d' encore et encore.
Je pense que certaines des autres réponses supposent que vous vouliez vous procurer un nouveau jeton d' actualisation pour une raison quelconque et ont suggéré que vous autorisiez à nouveau l'utilisateur, mais en fait, vous n'avez pas besoin de le faire puisque le jeton d' actualisation que vous avez fonctionnera jusqu'à révoqué par l'utilisateur.
la source
La réponse de Rich Sutton a finalement fonctionné pour moi, après avoir réalisé que l'ajout
access_type=offline
est effectué sur la demande du client frontal pour un code d'autorisation, pas sur la demande principale qui échange ce code pour un access_token. J'ai ajouté un commentaire à sa réponse et ce lien sur Google pour plus d'informations sur les jetons d'actualisation.PS Si vous utilisez Satellizer, voici comment ajouter cette option au $ authProvider.google dans AngularJS .
la source
Afin d'obtenir le,
refresh_token
vous devez inclureaccess_type=offline
dans l'URL de demande OAuth. Lorsqu'un utilisateur s'authentifie pour la première fois, vous récupérerez un non nulrefresh_token
ainsiaccess_token
qu'un expirant.Si vous avez une situation où un utilisateur peut réauthentifier un compte pour lequel vous avez déjà un jeton d'authentification (comme @SsjCosty le mentionne ci-dessus), vous devez récupérer les informations de Google sur le compte auquel le jeton est destiné. Pour ce faire, ajoutez
profile
à vos étendues. En utilisant la gemme OAuth2 Ruby, votre demande finale pourrait ressembler à ceci:Notez que la portée a deux entrées délimitées par des espaces, une pour l'accès en lecture seule à Google Analytics, et l'autre est juste
profile
, qui est une norme OpenID Connect.Cela se traduira par Google fournissant un attribut supplémentaire appelé
id_token
dans laget_token
réponse. Pour obtenir des informations sur id_token, consultez cette page dans la documentation Google. Il existe une poignée de bibliothèques fournies par Google qui valideront et «décoderont» ceci pour vous (j'ai utilisé la gemme Ruby google-id-token ). Une fois que vous l'avez analysé, lesub
paramètre est effectivement l'ID de compte Google unique.À noter, si vous changez la portée, vous récupérerez à nouveau un jeton d'actualisation pour les utilisateurs qui se sont déjà authentifiés avec la portée d'origine. Cela est utile si, par exemple, vous avez déjà un groupe d'utilisateurs et que vous ne souhaitez pas tous les annuler l'authentification de l'application dans Google.
Oh, et une dernière remarque: vous n'en avez pas besoin
prompt=select_account
, mais c'est utile si vous avez une situation où vos utilisateurs peuvent vouloir s'authentifier avec plus d'un compte Google (c'est-à-dire que vous ne l'utilisez pas pour la connexion / l'authentification) .la source
1. Comment obtenir 'refresh_token'?
Solution: l' option access_type = 'offline' doit être utilisée lors de la génération d'authURL. source: Utilisation d'OAuth 2.0 pour les applications de serveur Web
2. Mais même avec 'access_type = offline', je ne reçois pas le 'refresh_token'?
Solution: veuillez noter que vous ne l'obtiendrez qu'à la première demande, donc si vous le stockez quelque part et qu'il existe une disposition pour l'écraser dans votre code lorsque vous obtenez un nouveau access_token après l'expiration précédente, assurez-vous de ne pas écraser cette valeur.
Depuis Google Auth Doc: (cette valeur = access_type)
Si vous avez à nouveau besoin de 'refresh_token', vous devez supprimer l'accès à votre application en suivant les étapes écrites dans la réponse de Rich Sutton .
la source
Si vous le définissez, le jeton d'actualisation sera envoyé à chaque fois:
un exemple est donné ci-dessous (php):
la source
Pour moi, j'essayais
CalendarSampleServlet
fourni par Google. Après 1 heure, access_key expire et il y a une redirection vers une page 401. J'ai essayé toutes les options ci-dessus mais elles n'ont pas fonctionné. Enfin, en vérifiant le code source de «AbstractAuthorizationCodeServlet» , j'ai pu voir que la redirection serait désactivée si les informations d'identification sont présentes, mais idéalement, il aurait dû vérifierrefresh token!=null
. J'ai ajouté le code ci-dessous àCalendarSampleServlet
et cela a fonctionné après cela. Grand soulagement après tant d'heures de frustration. Dieu merci.la source
maintenant, google avait refusé ces paramètres dans ma demande (access_type, prompt) ... :( et il n'y a pas de bouton "Révoquer l'accès" du tout. Je suis frustré à cause du retour de mon refresh_token lol
MISE À JOUR: J'ai trouvé la réponse ici: D vous pouvez récupérer le jeton d'actualisation par une demande https://developers.google.com/identity/protocols/OAuth2WebServer
la source
la source
Utilisation de l' accès hors ligne et de l' invite: le consentement m'a bien fonctionné:
la source
Ma solution était un peu bizarre ... j'ai essayé toutes les solutions que j'ai trouvées sur Internet et rien. Étonnamment, cela a fonctionné: supprimez les informations d'identification, actualisez, vinculez à nouveau votre application dans votre compte. Le nouveau fichier credentials.json aura le jeton d'actualisation. Sauvegardez ce fichier quelque part. Ensuite, continuez à utiliser votre application jusqu'à ce que l'erreur d'actualisation du jeton réapparaisse. Supprimez le fichier crendetials.json qui n'est maintenant qu'avec un message d'erreur (cela s'est produit dans mon cas), puis collez-vous l'ancien fichier d'informations d'identification dans le dossier, c'est fait! Cela fait 1 semaine depuis que j'ai fait ça et je n'ai eu plus de problèmes.
la source
Afin d'obtenir un nouveau refresh_token à chaque authentification, le type d'informations d'identification OAuth 2.0 créées dans le tableau de bord doit être "Autre". De même, comme mentionné ci-dessus, l'option access_type = 'offline' doit être utilisée lors de la génération de l'authURL.
Lorsque vous utilisez des informations d'identification avec le type "Application Web", aucune combinaison de variables prompt / approbation_prompt ne fonctionnera - vous n'obtiendrez toujours le refresh_token qu'à la première demande.
la source