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
相关产品推荐
相关产品推荐

