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

问题描述 投票:0回答:3

我正在尝试制作一个与 google API(特别是 Google Classroom API)交互的不和谐机器人,因此我从 google 控制台创建了一个新项目,并为 Web 应用程序创建了一个新的 OAuth 客户端。我还启用了 Classroom API 并选择了我想要使用的所有范围:

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

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

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 = "classroom"
APIVERSION = "v1"
SCOPES = ['https://www.googleapis.com/auth/classroom.course-work.readonly', 'https://www.googleapis.com/auth/classroom.student-submissions.students.readonly', 'https://www.googleapis.com/auth/classroom.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

python oauth google-api google-classroom
3个回答
12
投票

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


2
投票

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

当在已验证帐户的会话中启动 OAuth 流程(使用帐户选择器)时,Oauth 流程会失败,并在转发 URL 中显示

/unknownerror
,并向用户显示通用信息“抱歉,出现问题。请尝试”又来了。”

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

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

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


1
投票

当人们实际需要受限范围时,这并不能解决问题,也不允许测试应用程序,这对于受限范围尤其重要。

为了进行测试,非 Chromium 浏览器似乎只会失败。您必须使用基于 Chromium 的浏览器来获取授权码。

在使用最新的 Firefox(版本 102)多次尝试出现此错误后,我安装了 Midori 的 snap,并且没有任何问题。现在应用程序已获得授权,我可以切换回 Firefox。

© www.soinside.com 2019 - 2024. All rights reserved.