应用程序一直要求“获得离线访问权限”,为什么?

34
在使用oAuth2授权并获取所请求的范围的权限后,每次尝试使用Google oAuth2登录时仍然会出现一个屏幕询问是否允许应用程序具有离线访问权限。一旦我授权它,它不应该再出现吗?请注意,上述内容中包含HTML标签。

enter image description here

你正在将哪些URL重定向? - SLaks
你的意思是什么?将授权码处理和用户登录的URL联系起来。 - jayarjo
你正在向Google的OAuth端点传递哪些参数? - SLaks
关于IdentityServer的讨论,但是与Google OAuth2相关的细节。https://github.com/IdentityServer/IdentityServer3/issues/2373 - Chris Moschini
5个回答

13

这个提示可能是由两个参数引起的:

  • access_type(如果它是'offline')
  • approval_prompt(如果它是'force')

确保您将access_type设置为'online',并将approval_prompt设置为“auto”

 $client->setAccessType('online');
 $client->setApprovalPrompt('auto') ;

你救了我的一天。非常感谢 :) - Bhavik Shah

10
你是否使用了approval_prompt参数?如果你已经拥有刷新令牌,请尽量避免再次请求离线访问权限。即使用户重新登录,它也应该保持有效,而无需请求离线访问权限。
关于此的参考资料可以在这里找到。

还有除了 "force" 以外的 approval_prompt 可能的取值吗?Google客户端库似乎默认发送它(必须检查源代码)。 - jayarjo
另一个值是 auto - user2897701
12
在本地开发时行为似乎有所不同:无论approval_prompt的值如何,您始终会收到“具有离线访问权限”的消息。 - Jan Kronquist

7
我的猜测是你的应用程序每次都要强制执行OAuth,因为用户已经授权了你请求的任何范围,所以不需要重复它们。然而,在缺乏更好的想法的情况下,屏幕上必须显示一些内容,因此Google请求“离线访问权限”。
只需确保您没有强制进行身份验证,您就应该没问题了。

我检查了一下,谷歌客户端库似乎默认发送approval_prompt=force。这是你的意思吗?我没有看到URL中有其他参数包含force这个词。 - jayarjo
是的,就是那个。我已经编辑了我的答案以更正参数名称。 - pinoyyid

6
这不是错误,而是Google OAuth2的正常情况。 第一步,按以下内容进行同意:
  1. 用户同意应用程序获取有关用户的信息。
  2. 当用户单击接受按钮时,浏览器将把同意信息保存到 Cookie 中,Google 帐户将保存权限(请查看 https://security.google.com/settings/security/permissions
从第二个过程开始:

浏览器检查 Google 帐户的 cookie 同意权限。

  • 如果浏览器中存在 cookie 并对此应用程序具有权限(https://security.google.com/settings/security/permissions),则同意屏幕将被忽略。
  • 如果浏览器中存在 cookie 但没有此应用程序的权限:同意屏幕将显示。
  • 如果浏览器中不存在 cookie:应用程序将显示“具有脱机访问权限”。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接