首页 文章

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

提问于
浏览
24

使用旧的谷歌openid,当我发送一个用户(之前选择加入我的应用程序)到auth url时,它会立即将它们重定向回我的应用程序 .

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

  • 用户通过我的应用登录谷歌并点击允许获取权限

  • 天后,Cookie被清除,用户返回我的网站,点击"Login to google"

  • 不再要求用户获得许可,他们会立即登录 .

我认为它与在步骤1中存储身份验证令牌或刷新令牌有关,但在步骤3中,我不知道他们是谁,所以我如何将它们与正确的身份验证或刷新令牌匹配以获得有效访问令牌 .

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

EDIT: Found the solution

创建auth url时,google-api默认设置“approval_prompt = force” .

3 回答

  • 0

    是的,因为您已经注意到使用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流不需要离线访问 .

  • 25

    只是在请求中传递了一个额外的参数 'approval_prompt=auto' 为我工作 .

  • 0

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

相关问题