You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Colab运行Directory API时重定向URI动态localhost端口问题求助

Google Colab 调用Directory API授权失败解决方案

核心问题原因

你当前使用的官方Quickstart默认采用桌面端OAuth授权流,会自动启动本地端口监听授权回调,而Colab是远程运行环境,本地端口的回调无法传递到Colab进程,因此会卡住,同时动态生成的端口也无法预先配置到重定向URI列表中。


方案1:切换为手动授权码模式(最快适配现有代码)

无需修改现有配置逻辑,仅需调整少量代码和重定向URI配置即可:

  • 打开Google Cloud Console对应的OAuth 2.0客户端ID配置页面,添加重定向URI urn:ietf:wg:oauth:2.0:oob 并保存
  • 将原有代码中的flow.run_local_server()替换为flow.run_console(),修改后代码示例如下:
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import pickle
import os.path

# 可根据实际需求调整权限范围
SCOPES = ['https://www.googleapis.com/auth/admin.directory.user']

def main():
    creds = None
    # 已生成的授权凭证缓存
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            # 替换为手动授权码模式,不会启动本地端口监听
            creds = flow.run_console()
        # 保存授权凭证,下次运行无需重复授权
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('admin', 'directory_v1', credentials=creds)
    # 此处编写你的API调用逻辑
  • 运行代码后点击输出的授权链接,使用有对应权限的Google Workspace管理员账号完成授权,复制页面生成的授权码,粘贴回Colab的输入框回车即可完成授权流程。

方案2:服务账号全域委派模式(适合长期自动化运行)

完全不需要处理重定向URI、端口变化、手动授权问题,更适合稳定运行的场景:

  • 在Google Cloud Console创建服务账号,开通Directory API权限,下载服务账号JSON密钥文件上传到Colab
  • 进入Google Workspace管理后台,为该服务账号配置全域委派权限,授权https://www.googleapis.com/auth/admin.directory.user对应的scope
  • 使用如下代码直接调用API:
from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/admin.directory.user']
# 替换为你的Google Workspace管理员账号邮箱
ADMIN_ACCOUNT = "admin@your-domain.com"
# 替换为你上传的服务账号密钥文件路径
KEY_PATH = "service-account-key.json"

creds = service_account.Credentials.from_service_account_file(
    KEY_PATH, scopes=SCOPES
)
# 模拟管理员账号调用API
delegated_creds = creds.with_subject(ADMIN_ACCOUNT)
service = build("admin", "directory_v1", credentials=delegated_creds)
# 此处编写你的API调用逻辑

注意事项

  • 若使用方案1,修改SCOPES后需要删除Colab环境中已生成的token.pickle文件,重新走授权流程
  • 若你的OAuth同意屏幕为外部测试模式,需要将使用的管理员账号添加到测试用户列表中,否则会出现应用未授权的报错
  • 两种方案都不需要再配置localhost或者colab.research.google.com作为重定向URI,也无需处理动态端口问题

内容的提问来源于stack exchange,提问作者user12815489

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:36:05