Google API OAuth 2 登录新的 OAuth 2 客户端出现问题

Posted

技术标签:

【中文标题】Google API OAuth 2 登录新的 OAuth 2 客户端出现问题【英文标题】:Google API OAuth 2 sign in something went wrong with new OAuth 2 client 【发布时间】:2021-04-25 12:54:42 【问题描述】:

我正在尝试制作一个与谷歌 API 交互的不和谐机器人,特别是谷歌课堂 API,因此我从谷歌控制台创建了一个新项目,并为 Web 应用程序创建了一个新的 OAuth 客户端。我也启用了 Clas-s-room API 并选择了我想使用的所有范围:

['https://www.googleapis.com/auth/clas-s-room.course-work.readonly',
 'https://www.googleapis.com/auth/clas-s-room.student-submissions.students.readonly',
 'https://www.googleapis.com/auth/clas-s-room.courses.readonly']

然后我使用 Google 的示例设置了我的 python 程序(起初我使用文档编写了自己的程序,但得到了相同的结果)。当我运行示例代码时一切正常,它打开浏览器并要求我选择我的帐户,我选择我的学校帐户,当它加载时,我希望出现一个授权屏幕来询问我是否允许请求的数据它说出了点问题,根本没有错误消息。我已经从谷歌仪表板下载了正确的credentials.json 文件夹并在我的程序中使用它。

我还将提供我编写的简化代码,也许那里有问题。

import pickle
import os
from google_auth_oauthlib.flow import Flow, InstalledAppFlow
from googleapiclient.discovery import build
from google.auth.transport.requests import Request


CLIENTSECRETPATH = "credentials.json"
APISERVICENAME = "clas-s-room"
APIVERSION = "v1"
SCOPES = ['https://www.googleapis.com/auth/clas-s-room.course-work.readonly', 'https://www.googleapis.com/auth/clas-s-room.student-submissions.students.readonly', 'https://www.googleapis.com/auth/clas-s-room.courses.readonly']

cred = None

if os.path.exists("toke.pickle"):
    with open("tiken.pickle", "rb") as token:
        cred = pickle.load(token)

if not cred or not cred.valid:
    if cred and cred.expired and cred.refresh_token:
        cred.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file(CLIENTSECRETPATH, SCOPES)
        cred = flow.run_local_server()

    with open("token.pickle", "wb") as token:
        pickle.dump(cred, token)

try:
    service = build(APISERVICENAME, APIVERSION, credentials=cred)

except Exception as e:
    print(e)

编辑: 我尝试更改谷歌控制台上的一些设置并随机决定单击发布,因为该项目仍处于测试状态,这样做之后我可以登录而没有错误。但这仍然不能解释为什么它在测试状态下不起作用,我将我的学校电子邮件地址添加到测试用户列表中,并确保我做的一切都是为了测试。

something went wrong screenshot

【问题讨论】:

正如我在您的代码中看到的,没有什么可能导致 出现问题 问题。如果您编辑您的问题并为其添加屏幕截图,将会很有帮助。 我添加了出错的屏幕截图,但它没有提供更多信息 正如我在您的屏幕截图中看到的,此问题可能是由于 credentials.json 文件 redirect_uris 字段造成的。因此,请编辑您的问题并添加此 json,但不要暴露域或 client_secret 字段等敏感数据。 我在尝试以工作区域测试用户身份访问未验证的应用程序并且用户已经按照下面@Alex 的描述登录时看到了同样的问题。但是当我尝试使用 Google 公共帐户(即@gmail.com)使用测试帐户时,它可以正常工作 我可以确认这也发生在我身上。只有在添加 oauth 范围时,登录才能正常工作。但是,使用我们组织域中的帐户可以正常工作。 【参考方案1】:

我看到了与 Alex 的帖子类似的问题。添加到目前为止我所看到的内容,希望有助于调试。

当 OAuth 流程在具有经过身份验证的帐户的会话中启动(使用帐户选择器)时,Oauth 流程失败并在转发 URL 中显示 /unknownerror,并且向用户显示一般的“抱歉,那里出了点问题. 再试一次。”

但是,如果 OAuth 流程是在用户需要登录其 Google 帐户的会话中启动的,则流程会按预期工作。

我确实怀疑这是测试应用程序和测试帐户的错误。但希望这会得到解决或找到一些解决方法。

我发现范围也有影响。对于基本范围(配置文件、电子邮件),不会发生错误流。但是一旦你添加了另一个更受限制的范围,错误流就会返回。

【讨论】:

是的,似乎是测试应用程序和测试帐户的问题。由于我有同时登录的学校电子邮件和普通电子邮件,因此碰巧让我陷入了这种情况。我的工作只是将项目置于已发布状态,因为我不使用任何敏感范围。【参考方案2】:

我无法回复上述问题(需要更多声誉),但可以确认我看到了相同的行为。更奇怪的是,仅当用户尝试使用已登录的帐户执行 OAuth 集成时,问题才会出现。用户会看到一个通用的“对不起,那里出了点问题。再试一次。”甚至在看到所需的范围列表之前就出错了。但是,如果用户没有登录到他们的帐户,并且作为 OAuth 集成的一部分登录,则不会出现错误并且可以成功完成集成。 这个问题不会影响未登录的用户这一事实表明设置(回调 API、credentials.json 等)都是正确的。我相信这个问题是在上个月左右引入的。

【讨论】:

以上是关于Google API OAuth 2 登录新的 OAuth 2 客户端出现问题的主要内容,如果未能解决你的问题,请参考以下文章

未为 Google OAUTH 登录配置访问权限

使用服务帐户通过 OAuth 2.0 调用 v3 Google 日历 API 时出现“需要登录”401 未经授权的消息

XMPP Google Talk X-OAUTH2 登录需要用户名

使用 OAuth 刷新令牌获取新的访问令牌 - Google API

Google Play 游戏服务 - 登录失败(OAUTH2:UNREGISTERED_ON_API_CONSOLE)

Google OAuth Api 未在登录时重定向