OAuth2与GSuite SDK(Python):服务账号「无权以此方式获取访问令牌」错误求助
我帮你排查下这个服务账号调用GSuite API的权限问题,这个错误通常是因为服务账号的授权配置没到位,咱们一步步来解决:
启用域范围授权(Domain-Wide Delegation)
这是GSuite API服务账号调用的核心配置,没有开启的话服务账号无法代表域内用户获取权限。操作步骤如下:- 登录你的GSuite管理控制台,进入「安全」>「API控制」>「域范围授权」
- 点击「添加新的客户端ID」,填入服务账号的客户端ID(可在GCP控制台的服务账号详情页找到)
- 在「OAuth 2.0 范围」中添加你要调用的API对应的权限范围,比如调用Admin Directory API就填
https://www.googleapis.com/auth/admin.directory.user.readonly,多个范围用逗号分隔
修正代码中的服务账号认证逻辑
你原来的代码可能用了普通OAuth2的认证流程,服务账号需要用专门的服务账号认证方式,并且必须指定要模拟的域内用户(因为服务账号本身没有GSuite域内的用户数据权限)。这里给你一个新版的示例代码:from google.oauth2 import service_account from googleapiclient.discovery import build # 替换成你需要的API权限范围 SCOPES = ['https://www.googleapis.com/auth/admin.directory.user.readonly'] # 替换成你的服务账号密钥文件路径 SERVICE_ACCOUNT_FILE = '/path/to/your/service-account-key.json' # 替换成你要模拟的域内授权用户(比如拥有Admin权限的账号) DELEGATED_USER = 'admin@yourdomain.com' # 加载服务账号凭证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) # 生成带有模拟用户的凭证 delegated_credentials = credentials.with_subject(DELEGATED_USER) # 构建API服务实例 service = build('admin', 'directory_v1', credentials=delegated_credentials) # 示例调用:获取域内用户列表 results = service.users().list(customer='my_customer', maxResults=10, orderBy='email').execute() users = results.get('users', []) if not users: print('No users found.') else: print('Users:') for user in users: print(f"{user['primaryEmail']} ({user['name']['fullName']})")确认目标API已在GCP控制台启用
登录GCP控制台,进入「API和服务」>「已启用的API和服务」,搜索并确保你要调用的GSuite API(比如Admin Directory API、Drive API等)已经被启用,未启用的话点击「启用」按钮即可。检查服务账号的角色权限
在GCP控制台的服务账号详情页,确认服务账号被赋予了必要的项目角色,比如调用Admin API可以赋予「Admin SDK Administrator」角色,但注意这只是项目层面的权限,核心还是域范围授权的配置。
内容的提问来源于stack exchange,提问作者TorTurner
相关产品推荐
相关产品推荐

