Google API范围已更改

时间:2018-07-19 05:03:16

标签: django python-3.x google-api google-oauth

编辑:通过在示波器上添加“ https://www.googleapis.com/auth/plus.me”可以轻松解决该问题,但是我想开始对此主题进行讨论,看看是否有人遇到同样的问题。

我有一项在GCP(使用Google API的应用引擎)上运行的服务。今天早上,我收到了此“警告”消息,引发了500错误。 在过去的一个月中,它一直运行良好,直到今天(在发布此信息之前5小时)才抛出此错误。

有人知道为什么Google在oauth2callback上返回了另一个范围吗?非常感谢您提供任何其他见解。如果您之前从未看过,请告诉我。我在任何地方都找不到。

  

异常类型:/ oauth2callback发出警告

     

异常值:   范围已从   “ https://www.googleapis.com/auth/userinfo.email”   “ https://www.googleapis.com/auth/userinfo.email   https://www.googleapis.com/auth/plus.me”。

此行引发了错误:

flow.fetch_token(
        authorization_response=authorization_response,
        code=request.session["code"])

返回网址为https://my_website.com/oauth2callback?state=SECRET_STATE&scope=https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/plus.me#

代替通常的https://my_website.com/oauth2callback?state=SECRET_STATE&scope=https://www.googleapis.com/auth/userinfo.email#

编辑:示例代码

import the required things

SCOPES = ['https://www.googleapis.com/auth/userinfo.email',
          'https://www.googleapis.com/auth/calendar',
          # 'https://www.googleapis.com/auth/plus.me' <-- without this, it throws the error stated above. adding it, fixes the problem. Google returns an additional scope (.../plus.me) which causes an error.
          ]

def auth(request):
    flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
        CLIENT_SECRETS_FILE, scopes=SCOPES)
    flow.redirect_uri = website_url + '/oauth2callback'
    authorization_url, state = flow.authorization_url(
        access_type='offline', include_granted_scopes='true', 
prompt='consent')
    request.session["state"] = state
    return redirect(authorization_url)

def oauth2callback(request):
    ...
    # request.session["code"] = code in url
    authorization_response = website_url + '/oauth2callback' + parsed.query
    flow.fetch_token(
    authorization_response=authorization_response,
    code=request.session["code"])
    ...

5 个答案:

答案 0 :(得分:3)

我们今天发现了同样的问题。在过去的几个月中,我们的解决方案一直没有出现任何问题。

我们通过将原始范围“个人资料电子邮件” 更新为 https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile 并对代码进行了一些小的更改来解决了该问题

在启动google_auth_oauthlib.flow客户端时,我们先前在列表中传入的范围只有一个项目,该项目包含一个字符串,其中字符串用空格分隔。

google_scopes = 'email profile'
self.flow = Flow.from_client_secrets_file(secret_file, scopes=[google_scopes], state=state)

现在,使用更新的范围,我们发送一个列表,其中每个元素都是一个单独的范围。

google_scopes = 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'    
self.flow = Flow.from_client_secrets_file(secret_file, scopes=google_scopes.split(' '), state=state)

希望有帮助,祝您好运!

答案 1 :(得分:0)

根据您的错误猜测,似乎您使用的是折旧范围。看到: https://developers.google.com/+/web/api/rest/oauth#deprecated-scopes

我还猜测您可能正在使用Google+ Platform Web library甚至是People:Get方法。也许尝试改为使用以下范围之一:

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

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

答案 2 :(得分:0)

鉴于时间安排,您可能会受到Google所做的更改的影响: “从2017年7月18日开始,要求某些敏感OAuth范围的Google OAuth客户端将受到Google的审查。” https://developers.google.com/apps-script/guides/client-verification

答案 3 :(得分:0)

我正在使用requests_oauthlib扩展名,并且遇到相同的错误。我通过在环境变量中添加OAUTHLIB_RELAX_TOKEN_SCOPE: '1'来解决此问题。所以我的app.yaml文件与此类似:

#...
env_variables:
  OAUTHLIB_RELAX_TOKEN_SCOPE: '1'

答案 4 :(得分:0)

对于我来说,我在该函数中添加了以下行,即正在进行身份验证 os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '1' flow = InstalledAppFlow.from_client_config(client_config, scopes=SCOPES)