我曾经使用Angular2
开发了一个使用Oauth2 Google+ API
开发的Web应用程序的身份验证模块,这里的问题是google服务器响应除了{{{{}}之外不包含任何刷新令牌1}},access_token
,expires_in
,token_type
键,我试图撤销授予我的应用程序的访问权限并重试但仍然是同样的问题;以下是id_token
查询中添加的参数:
POST
问题在于,在官方文档中谷歌表示它应该返回 code=4/BXlTY3dLzpUMfu4WuapGjn1du6TCVXEt6Wxjf7-EK_E
&client_id=429410750270503bndl.apps.googleusercontent.com
&client_secret=*****GZe11WEgy9Glg2T
&grant_type=authorization_code
&redirect_uri=http://localhost:3000/loginplus
&access_type=offline
,但我没有看到它,我只有上面提到的那些,这里是回复
refresh_token
我搜索了很多,但没有一个答案对我有帮助,任何帮助?
答案 0 :(得分:2)
使用access_type=offline
的问题是您的应用程序很可能已经与用户交换了授权代码。如果是这种情况,它会在第一次通话中发回response_code
。您应该存储此代码以供进一步使用。
如果您想获得新的refresh_token
,则必须再次询问用户是否同意使用您的应用程序。
如需进一步参考,请阅读this
特别是这个重要的部分:
重要提示:当您的应用程序收到刷新令牌时,存储该刷新令牌以供将来使用非常重要。如果您的应用程序丢失了刷新令牌,则必须在获得另一个刷新令牌之前重新提示用户同意。如果您需要重新提示用户同意,请在授权代码请求中包含prompt参数,并将该值设置为同意。
答案 1 :(得分:0)
TL;博士 在这种情况下,需要approval_prompt = force来获取刷新令牌。
详细说明:
如果想要获得刷新令牌,则在请求中始终需要access_type = offline。 (PierreDuc的另一个答案是不正确的) 但有时在交换您获得的“授权代码”后,您可能无法获得刷新令牌。 为什么? 为了返回新的刷新令牌,我们希望用户同意。如果用户已经批准了您的应用程序的离线同意,我们知道该应用程序已经有一个刷新令牌(至少一个),并且通常不应该一次又一次地要求它。因此,我们不会显示批准页面并返回仅提供访问令牌的代码。
如果以前的刷新令牌丢失并且您想再次获取它,那么在请求中添加approval_prompt = force会向用户显示一个批准页面,并且还会为您提供一个代码来提供刷新令牌。
答案 2 :(得分:0)
此问题已更新,必要的查询参数现在为prompt=consent
请参阅https://developers.google.com/identity/protocols/OAuth2WebServer#redirecting