为什么Google OAuth2会在我再次将其发送到auth url时重新询问用户的权限

时间:2012-05-09 01:00:14

标签: oauth-2.0

使用旧的google openid,当我将一位用户(之前曾选择加入我的应用)发送到auth网址时,它会立即将其重定向回我的应用。

现在,使用OAuth2,auth url不断询问用户是否允许。我读了一些关于这个的文档,但是我没有得到的是我应该如何工作:

  1. 用户通过我的应用登录谷歌并点击“允许权限”
  2. 几天后,Cookie被清除,用户返回我的网站,点击“登录google”
  3. 不会再次要求用户获得许可,他们会立即登录。
  4. 我认为这与在步骤1中存储身份验证令牌或刷新令牌有关 但是在第3步中,我不知道它们是谁,所以如何将它们与正确的auth或刷新令牌匹配以获得有效的访问令牌。

    在我的测试中,当我在步骤1中将它们发送到原始身份验证网址时,会再次要求他们获得权限。

    编辑:找到解决方案

    创建auth网址时,google-api默认设置“approval_prompt = force”。

4 个答案:

答案 0 :(得分:25)

是的,因为您已经注意到使用approval_prompt = force URL参数将强制每次向用户显示auth对话框。只需删除此URL参数,就不会在后续的身份验证流程中提示用户。

如果使用服务器端流程(response_type = code)和脱机访问(access_type = offline),您将获得的响应略有不同。用户第一次授权您(当他看到批准屏幕时)或者您通过使用approval_prompt = force强制执行此操作,那么当您交换身份验证代码时,您将被授予refresh_token和access_token。

但是,每次未向用户显示批准屏幕时(未使用approval_prompt = force时的后续身份验证),在交换身份验证代码时,您将只被授予access_token,而不是refresh_token。因此,如果这是您正在使用的流程,并且如果您希望能够脱机访问用户的数据,则需要确保在本地保存refresh_token以供将来使用,当您第一次获得它时。只有当您请求访问其他类型的数据而不仅仅是auth数据时,才会发生这种情况(使用OAuth 2流,您可以请求访问其他数据,例如Contacts API数据,Calendar API数据,驱动器数据等...通常,常规的Open ID流不需要离线访问。

答案 1 :(得分:0)

在请求'approval_prompt=auto'中传递一个额外的参数对我有用。

答案 2 :(得分:0)

对我而言,它是hd(托管域名)参数。从授权URL中删除后,我获得了一个用户选择Auth的列表。有关hd参数https://developers.google.com/identity/protocols/OpenIDConnect#hd-param

的更多信息

答案 3 :(得分:0)

稍作更新,此链接可以帮助您:https://github.com/googleapis/oauth2client/issues/453

“批准提示”由带有以下参数的“提示”代替:“无”,“同意”和“ select_account”