25

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

现在,使用 OAuth2,auth url 不断向用户请求许可。我阅读了一些关于此的文档,但我不明白这个流程我应该如何工作:

  1. 用户通过我的应用程序登录谷歌并点击允许权限
  2. 几天后,cookies被清除,用户回到我的网站,点击“登录谷歌”
  3. 用户不再被要求获得许可,他们立即登录。

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

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

编辑:找到解决方案

google-api 在创建 auth url 时默认放置“approval_prompt=force”。

4

4 回答 4

26

是的,正如您所指出的,使用approval_prompt=forceURL 参数将强制每次向用户显示身份验证对话框。通过简单地删除此 URL 参数,用户将不会在后续身份验证流程中收到提示。

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

但是,每次用户未显示批准屏幕时(不使用approval_prompt=force 时的后续身份验证),在交换身份验证代码时,您只会被授予access_token,没有refresh_token。因此,如果这是您正在使用的流程,并且如果您希望能够离线访问用户的数据,则需要确保将 refresh_token 保存在本地以供第一次使用时使用。

仅当您请求访问其他类型的数据而不是简单的身份验证数据时才可能发生这种情况(使用 OAuth 2 流程,您可以请求访问其他数据,例如,联系人 API 数据、日历 API 数据、驱动器数据等...)因为通常情况下,常规的 Open ID 流不需要离线访问。

于 2012-06-12T19:07:02.633 回答
0

只需在请求中传递一个附加参数'approval_prompt=auto'对我有用。

于 2016-10-17T17:37:11.920 回答
0

对我来说,它是hd(托管域)参数。从授权网址中删除后,我得到了一个可供选择进行身份验证的用户列表。hd有关此处参数的更多信息https://developers.google.com/identity/protocols/OpenIDConnect#hd-param

于 2017-06-13T16:45:01.953 回答
0

有一点更新,这个链接可以帮助:https ://github.com/googleapis/oauth2client/issues/453

'approval prompt' was replaced by 'prompt' with params: 'none', 'consent' and 'select_account'

于 2019-04-15T17:51:20.440 回答