“当app_type = online时,此应用程序希望:具有脱机访问权限”

时间:2014-01-28 12:07:44

标签: oauth-2.0 google-oauth

我有一个使用OAuth 2.0身份验证的Google App。以前一切都很好,但最近我开始获得以下“请求许可”屏幕:

enter image description here

奇怪的是,当我通过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日):

即使使用新的范围,我仍然会获得同意屏幕。最近我得到了一个我用于身份验证的新设备。

9 个答案:

答案 0 :(得分:29)

我认为G会在您的应用请求令牌时执行此操作,并且该用户仍然可以使用有效的访问权限或刷新令牌。

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

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

您不必提供任何应用凭据,只需将提示作为网址参数。

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

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

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

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

答案 1 :(得分:19)

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

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才能实现此目的。

答案 2 :(得分:18)

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

答案 3 :(得分:5)

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

  

$ client-> setApprovalPrompt(“auto”);

答案 4 :(得分:1)

我认为已经回答了,但我现在找不到链接。

简而言之,Google最近围绕范围进行了一些更改,以实现增量范围。这些更改的一部分是,如果您的应用导致auth提示,但用户已经过操作,则Google必须要求提供某些内容,因此请求进行离线访问。尝试设置

approval_prompt=auto

避免提示

答案 5 :(得分:1)

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

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似乎没有反驳这个概念,所以我不确定它为什么会这样。但至少我现在能够按照我想要的方式工作。

答案 6 :(得分:0)

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

'离线访问'

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

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

答案 7 :(得分:-1)

您使用的是Google API客户端库吗?

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

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

在Python版本中,我更改了oauth2client / client.py

的第1204行

    'access_type': 'offline',

    'access_type': 'online',

现在它可以正常工作。

答案 8 :(得分:-2)

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