“此应用程序想要:具有离线访问”access_type =联机时
我有一个使用OAuth 2.0身份validation的Google App。 一切都很好,但最近我开始获得以下“请求许可”屏幕:
奇怪的部分是,当我通过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:
这是我用来生成身份validationURL的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日):
即使有新的范围,我仍然得到同意的屏幕。 最近我得到了一个我用来进行身份validation的新设备。
我认为当你的应用程序请求一个令牌时,G会执行此操作,并且对于有问题的作用域,用户仍然有一个有效的访问或刷新令牌。
解决方法是在完成这些令牌(通过用户注销或在对用户进行身份validation之后立即撤销令牌),方法是发出此请求:
https://accounts.google.com/o/oauth2/revoke?token={token}
您不必提供任何应用凭据,只需将该令牌作为URL参数。
(docs https://developers.google.com/accounts/docs/OAuth2WebServer#tokenrevoke )
我有同样的问题,并没有access_type
或approval_prompt
值似乎解决它的组合。 取消令牌取得了诀窍。
我不知道如何撤销您的应用程序的所有未完成的令牌,除非您碰巧存储它们。 要使用您自己的用户帐户进行testing,您可以在此处手动为您的应用程序撤销现有的令牌:
https://security.google.com/settings/security/permissions
谷歌最近改变了电子邮件的范围。 你应该更换
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
警告:此范围已被弃用。 Google将于2014年9月1日之后不再支持此范围。有关详情,请参阅迁移到Google+login。
这也改变了电子邮件地址的接收方式:
另外请记住,您必须在pipe理控制台中激活Google+ API才能使其正常工作。
在OAuth请求的redirect_url
参数中使用http://localhost
将导致要求用户在每次login后第一次进行身份validation时授予脱机访问权限。
Tzach。 为了在第一次login后不提示同意屏幕。 您可能需要将值传递给函数:
$ client-> setApprovalPrompt(“auto”);
我想这个问题已经得到解答,但我现在找不到链接。
简而言之,Google最近对范围进行了一些修改,以实现增量范围。 其中部分变化是,如果您的应用程序导致auth提示,但用户已经authentication,Google必须要求一些东西,请求离线访问。 尝试设置
approval_prompt=auto
避免提示
我有同样的问题。 虽然我没有设置
access_type=online
不过,据我了解,默认
access_type
是
online
来自: https : //developers.google.com/identity/protocols/OAuth2WebServer :“访问的默认样式在线调用”。
为我解决这个问题是删除:
prompt=consent
当然还有一个同意书,就是现在不是要求离线访问的同意书,这可能吓跑一些潜在的用户。
我相信提示参数是作为approval_prompt参数的替代。 但是,如果我把它设置为“同意”,那应该只是意味着我要每次显示正常的同意屏幕,而不是“离线访问”同意屏幕。 这里的文档: https : //developers.google.com/identity/protocols/OpenIDConnect#prompt似乎并没有反驳这个概念,所以我不确定为什么这样做。 但至less我现在能够按照我想要的方式工作。
那么,我不知道这是否构成一个答案,但我发现有些用户看到:
'有离线访问'
相比其他人(谁得到我认为你想看到的):
'查看关于您的帐户的基本信息'
您是否在使用Google API客户端库?
https://developers.google.com/api-client-library/
当刷新令牌时,它将access_type设置为“脱机”
在Python版本中,我更改了oauth2client / client.py的第1204行
从
'access_type': 'offline',
至
'access_type': 'online',
现在它工作正常。
我在这个问题上应用了一切。 在我的情况下,只有清除cookies工作。