该应用程序一直要求“离线访问”的权限,为啥?

Posted

技术标签:

【中文标题】该应用程序一直要求“离线访问”的权限,为啥?【英文标题】:The App keeps asking for permission to "Have offline access", why?该应用程序一直要求“离线访问”的权限,为什么? 【发布时间】:2014-02-01 12:52:29 【问题描述】:

在使用 oAuth2 授权应用并获取所请求范围的权限后,每次尝试使用 Google oAuth2 登录时,我仍然会看到一个屏幕询问我是否授予应用离线访问权限.一旦我授予它拥有它的权限,它不应该再次出现吗?

【问题讨论】:

您要重定向到哪些 URL? 什么意思?到处理授权代码并让用户登录的 URL。 您将哪些参数传递给 Google 的 OAuth 端点? github相关讨论;关于 IdentityServer 但与 Google OAuth2 相关的详细信息 github.com/IdentityServer/IdentityServer3/issues/2373 【参考方案1】:

我的猜测是您的应用程序每次都强制执行 OAuth。由于用户已经授权了您请求的任何范围,因此无需重复它们。然而屏幕必须说些什么,所以在没有更好的想法的情况下,谷歌请求“离线访问”。

只要确保您没有强制进行身份验证,就可以了。

【讨论】:

我检查了谷歌客户端库似乎默认发送approval_prompt=force。你是这个意思吗?我没有看到 url 中包含 word force 的任何其他参数。 是的,就是这样。我已经编辑了答案以更正参数名称【参考方案2】:

您使用approval_prompt 参数吗?如果您已经拥有刷新令牌,请尽量不要再次要求离线访问。即使用户再次登录,它也应该保持有效,而无需请求离线访问。

可以在here找到有关此的参考。

【讨论】:

除了 - force 之外,approval_prompt 还有其他可能的值吗? Google 客户端库似乎默认发送它(必须检查源)。 另一个值为auto 在 localhost 上开发时的行为似乎有所不同。:无论approval_prompt 值如何,您总是会得到“离线访问”。【参考方案3】:

这个提示可能是因为两个参数,

access_type(如果是“离线”) approval_prompt(如果是“强制”)

确保您已将 access_type 设置为 'online' 并将 apporoval_prompt 设置为 'auto'

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

【讨论】:

你拯救了我的一天。非常感谢:)【参考方案4】:

这不是错误。这是google oauth2的正常场景。

第一流程同意如下:

    用户同意应用程序获取有关用户的信息。 当用户点击接受按钮时,浏览器会将同意信息保存到cookie中,谷歌帐户将保存权限(请查看https://security.google.com/settings/security/permissions)

来自第二个进程:

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

如果 cookie 存在于浏览器中并且拥有此应用程序的权限 (https://security.google.com/settings/security/permissions):同意屏幕将被忽略 如果 cookie 存在于浏览器中但没有此应用程序的权限:将显示同意屏幕 如果浏览器中不存在 cookie:应用程序将显示“Have offline access”。

【讨论】:

【参考方案5】:

根据增量身份验证机制及其设计,这很可能是非常正常的,其想法是如果用户已经授予了应用程序的权限,则无需显示相同的权限并要求用户批准。

http://googleplusplatform.blogspot.com/2013/12/google-sign-in-improvements11.html

【讨论】:

以上是关于该应用程序一直要求“离线访问”的权限,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

当 access_type=online 时,“此应用程序希望:具有离线访问权限”

为啥iOS上的FB SDK要求朋友列表的权限,而应用程序不要求它

当您在 iOS 应用程序和服务器中都使用令牌时如何处理 Facebook 弃用的离线访问权限

Facebook 完全权限 AccessToken 替代离线访问令牌

为啥whatsapp web应用程序一直需要电话连接?

OAuth 中的“离线”访问是啥意思?