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

Posted

技术标签:

【中文标题】当 access_type=online 时,“此应用程序希望:具有离线访问权限”【英文标题】:"This app would like to: Have offline access" when access_type=online 【发布时间】:2014-02-19 17:35:05 【问题描述】:

我有一个使用 OAuth 2.0 身份验证的 Google 应用。过去一切正常,但最近我开始收到以下“请求许可”屏幕:

奇怪的是,当我通过access_type=online 时,我得到了这个屏幕。同样,直到最近,这一直有效。

这可能是什么原因? TIA

编辑:

请求的范围是:

https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile

我已经试过了:

有和没有access_type=online 有和没有approval_prompt=auto

编辑#2:

这是我用来生成身份验证 URL 的 python 代码:

encoded_params = urllib.urlencode(
    "response_type" : "code",
    "client_id" : MY_CLIENT_ID,
    "scope" : " ".join(MY_SCOPES),
    "redirect_uri" : MY_REDIRECT_URI,
    "state" : random_security_token,
    "access_type" : "online",
    "approval_prompt" : "auto",
    )

auth_url = "https://accounts.google.com/o/oauth2/auth?" + encoded_params

更新(10 月 14 日):

即使使用新的示波器,我仍然会看到同意屏幕。最近我为我用于身份验证的新设备买了它。

【问题讨论】:

您如何请求 oauth2 权限?您是否有一个可以从谷歌驱动器预先验证启动的应用程序,或者它是使用 api 独立启动的?如果是后者,您可以将身份验证代码添加到问题中吗? @daw 我正在使用 python 并手动生成身份验证 url,请参阅我所做的编辑。 嗯 - 看起来不错。从谷歌驱动器启动时,我请求相同的范围并得到这个不需要的提示。谷歌自己正在将“access_type:offline”添加到他们创建的网址中。我想知道是不是因为电子邮件地址可以离线使用,所以他们覆盖了 access_type? @Tzach 在哪里可以解决您的问题?我遇到了同样的问题,但我无法找到解决方案。 您的redirect_url 是否包含“localhost”?我也有这个问题。我将 redirect_url 更改为公共域地址,到目前为止它已经解决了这个问题。我还没有打算重现错误(还)。不确定这是否是实际的修复。 【参考方案1】:

我认为这个问题已经得到解答,但我现在找不到链接。

简而言之,Google 最近围绕范围进行了一些更改,以实现增量范围。这些变化的一部分是,如果您的应用程序引起了身份验证提示,但用户已经进行了身份验证,谷歌必须要求一些东西,所以要求离线访问。尝试设置

approval_prompt=auto

避免提示

【讨论】:

谢谢,但是我特意要求在线访问的时候,要求离线访问的原因是什么?这可能会使用户感到困惑,甚至可能阻止他批准访问。 我同意,并且已经向 Google 提出了几次。在您的情况下,重点是让您的应用根本不提示。 顺便说一句,我的请求中已经有approval_prompt=auto,但仍然得到提示屏幕。【参考方案2】:

扎克。为了在首次登录后不提示同意屏幕。您可能需要这个来将值传递给函数:

$client->setApprovalPrompt ("auto");

【讨论】:

已经试过了。请阅读问题和其他答案。【参考方案3】:

好吧,我不知道这是否真的构成了一个答案,但我发现 一些 用户会看到:

'具有离线访问权限'

与其他人(我认为你想看到的)相比:

'查看有关您帐户的基本信息'

【讨论】:

问题是我得到了这个屏幕,尽管我在过去的某个时候已经批准了这个应用程序。这就像一个额外的批准。 嗯,也许这与将approval_prompt 替换为prompt 有关? (developers.google.com/accounts/docs/OAuth2Login#prompt)【参考方案4】:

更新:

现在是电子邮件的范围

email

旧版 Google+ API 已于 2019 年 3 月 7 日关闭。范围 您的应用程序之前请求的内容现在可能已被弃用或无效。 开发人员应更新他们的代码以删除或更新对 Google+、Google+ API 和任何相关的 OAuth 范围。 来源: https://developers.google.com/+/scopes-shutdown

-- 旧答案--

Google 最近更改了电子邮件的范围。你应该替换

https://www.googleapis.com/auth/userinfo.email

与:

https://www.googleapis.com/auth/plus.profile.emails.read 

和:

https://www.googleapis.com/auth/plus.login

那么离线访问应该会消失。

另见:

https://developers.google.com/+/api/oauth#email

警告:此范围已弃用。 2014 年 9 月 1 日之后,Google 将不再支持此范围。有关详细信息,请参阅迁移到 Google+ 登录。

这也改变了接收电子邮件地址的方式:

https://developers.google.com/+/api/auth-migration#email

另外请记住,您必须在管理控制台中激活 Google+ API 才能使其正常工作。

【讨论】:

很好的答案,谢谢!实际上,新的作用域应该是emailprofile,因为它们等同于问题中请求的作用域。 很高兴能为您提供帮助。 嗯,我使用“电子邮件配置文件”作为我的范围字符串,但仍然获得“具有离线访问权限”的权限请求。真正奇怪的是它只发生在集成测试中,而不是手动发生。在这两种情况下,我都运行相同的服务器环境并使用相同的谷歌凭据。 嗯,这很奇怪。对我来说设置:“approval_prompt”到“auto”有帮助,但我想你已经尝试过了。 看起来他们仍将支持 userinfo.email,尽管已被贬低(我不再看到该警告,仅在迁移指南中显示:已弃用,将被维护并保留以供向后使用兼容性。Google 将继续使用这些范围生成新令牌。【参考方案5】:

您在使用 Google API 客户端库吗?

https://developers.google.com/api-client-library/

它在自己刷新令牌时将 access_type 设置为“离线”

在 Python 版本中,我更改了 oauth2client/client.py 的第 1204 行

来自

    'access_type': 'offline',

    'access_type': 'online',

它现在可以正常工作了。

【讨论】:

我没有使用这个库,请参阅问题以获取生成 url 的确切代码。【参考方案6】:

我认为 G 会在您的应用请求令牌并且对于相关范围的用户仍有有效的访问或刷新令牌时执行此操作。

解决方案是在您使用完令牌后(在用户注销时或在验证用户身份后立即)通过发出此请求来撤销令牌:

https://accounts.google.com/o/oauth2/revoke?token=token

您无需提供任何应用凭据,只需将令牌作为 URL 参数即可。

(此处为文档https://developers.google.com/accounts/docs/OAuth2WebServer#tokenrevoke)

我遇到了同样的问题,access_typeapproval_prompt 值的组合似乎无法解决它。撤销令牌就行了。

我不确定如何为您的应用撤销所有未完成的令牌,除非您碰巧存储了它们。要使用您自己的用户帐户进行测试,您可以在此处手动撤销您应用的现有令牌:

https://security.google.com/settings/security/permissions

【讨论】:

谢谢!这为我节省了很多空周期:)。您帖子上的最后一个链接起到了作用【参考方案7】:

在 OAuth 请求的 redirect_url 参数中使用 http://localhost 将导致用户在每次登录后首次进行身份验证时被要求授予离线访问权限。

【讨论】:

谢谢。这是在某处记录的吗?这种行为有原因吗? 我看不到。这只是我使用反复试验的经验。在一堆问题中也提到了localhost 行为:***.com/questions/20555351/…***.com/questions/28957654/…***.com/questions/28052155/…【参考方案8】:

我在这个问题中应用了所有内容。就我而言,只有清除 cookie 有效。

【讨论】:

【参考方案9】:

我遇到了同样的问题。虽然我没有设置

access_type=online

不过根据我的理解,默认的

access_type 

online 

发件人:https://developers.google.com/identity/protocols/OAuth2WebServer: "默认的访问方式称为在线。"

为我解决这个问题的方法是删除:

prompt=consent

一开始当然还是有同意书的,刚才不是要求离线访问的同意书,可能会吓跑一些潜在用户。

我相信 prompt 参数旨在替代approval_prompt 参数。但似乎如果我将其设置为“同意”,那应该只是意味着我希望每次都显示正常的同意屏幕,而不是“离线访问”同意屏幕。这里的文档:https://developers.google.com/identity/protocols/OpenIDConnect#prompt 似乎并没有反驳这个概念,所以我不确定它为什么会这样。但至少我现在能够让它按照我想要的方式工作。

【讨论】:

以上是关于当 access_type=online 时,“此应用程序希望:具有离线访问权限”的主要内容,如果未能解决你的问题,请参考以下文章

将SharePoint Online Client组件(Microsoft.SharePoint.Client)与powershell 2.0一起使用

Online ddl 工具之pt-online-schema-change

在 Visual Studio Online 上构建结束时的 Git 标记(构建 vNext,托管池)

Excel Online 自动数据填充

如何从 ArcGIS Online 地图中抓取数据?

[笔记]FTRL与Online Optimization