“此应用程序想要:具有离线访问”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_typeapproval_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。

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

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

另外请记住,您必须在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工作。