Oauth 2.0 当我再次将用户发送到认证url时,为什么Google OAuth2会重新请求用户许可

Oauth 2.0 当我再次将用户发送到认证url时,为什么Google OAuth2会重新请求用户许可,oauth-2.0,Oauth 2.0,使用旧的google openid,当我将一个用户(之前选择了我的应用程序)发送到auth url时,它会立即将他们重定向回我的应用程序 现在,在OAuth2中,auth url不断地向用户请求权限。我读了一些关于这方面的文档,但我不明白这个流程应该如何运作: 用户通过“我的应用”登录到谷歌,并单击“允许权限” 几天后,cookies被清除,用户回到我的网站,点击“登录谷歌” 不会再次向用户请求权限,用户将立即登录 我认为这与在步骤1中存储身份验证令牌或刷新令牌有关, 但在第3步中,我不知道他们

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

现在,在OAuth2中,auth url不断地向用户请求权限。我读了一些关于这方面的文档,但我不明白这个流程应该如何运作:

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

    在我的测试中,当我在步骤1中将它们发送到原始的auth url时,它们会再次被请求权限

    编辑:找到解决方案


    google api在创建身份验证url时默认设置“approval\u prompt=force”。

    是,正如您所指出的,使用
    approval\u prompt=force
    url参数将强制每次向用户显示身份验证对话框。只需删除此URL参数,用户就不会在后续验证流中收到提示

    如果使用服务器端流(
    response\u type=code
    )和脱机访问(
    access\u type=offline
    ),将得到的响应略有不同。当用户第一次授权您时(当他看到批准屏幕时),或者如果您使用
    approval\u prompt=force
    强制执行此操作,则当您交换身份验证代码时,将授予您一个
    refresh\u token
    和一个
    access\u token

    但是,每次用户未显示批准屏幕时(未使用批准时的后续认证提示=强制),在交换认证代码时,您将只被授予访问令牌,而不被授予刷新令牌。因此,如果这是您正在使用的流,并且如果您希望能够脱机访问用户的数据,则需要确保您将刷新令牌保存在本地,以便在第一次获取时供将来使用


    这只有在您请求访问其他类型的数据而不仅仅是身份验证数据时才会发生(使用OAuth 2流,您可以请求访问其他数据,例如联系人API数据、日历API数据、驱动器数据等),通常情况下,常规的开放ID流不需要脱机访问。

    只需在请求中传递一个附加参数
    'approval\u prompt=auto'
    对我有效。

    对我来说,它是
    hd
    (托管域)参数。从授权url中删除后,我得到了一个用户列表,供选择进行身份验证。有关
    hd
    参数的更多信息,请参见此处

    有轻微更新,此链接可帮助:


    “批准提示”被“提示”替换为参数“无”、“同意”和“选择账户”

    我已经按照谷歌文档的说法将其设置为“自动”。但遗憾的是,它总是再次请求许可。嗨,dyoser,我也有同样的问题。您是否有机会修复此问题?您必须通过将代码交换为令牌来完成此过程,然后应用程序将显示在此处的列表中,用户将不会再次被要求获得权限。
    access\u type=offline
    approval\u prompt=force
    是迄今为止获得刷新的唯一有效组合经过几个小时的尝试后,使用curl测试带有响应的令牌和访问令牌!你会得到这样的结果:数组([access\u token]=>ya29.Glv4…[expires\u in]=>2017-11-03 22:25:33[id\u token]=>eyJWY…[refresh\u token]=>1/1fg…[token\u type]=>Bearer)