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

使用Google Admin SDK Directory API服务账号访问非管理员用户数据遇403错误

问题原因分析与解决方案

核心错误:模拟对象错误

你当前脚本中用credentials.with_subject(USER_EMAIL_TO_CHECK)模拟的是要查询的非管理员用户,但Google Admin SDK Directory API要求调用者必须具备域内用户数据的访问权限——非管理员用户默认没有调用该API的权限,因此触发403错误。而管理员用户本身拥有该权限,所以模拟管理员时能正常获取数据。

解决方案步骤

1. 修改模拟的用户账号

将with_subject的参数替换为域内拥有用户管理权限的管理员邮箱,而非目标用户邮箱。示例:

# 替换为你的域管理员邮箱
ADMIN_EMAIL = 'admin@example.com'
# 模拟管理员账号
credentials = credentials.with_subject(ADMIN_EMAIL)

之后再调用users().get(userKey=USER_EMAIL_TO_CHECK)即可查询任意域内用户的数据。

2. 验证域级委派配置

确认在Google Admin控制台的安全 > API控制 > 域级委派中,已为你的服务账号客户端ID添加以下scope并授权:
https://www.googleapis.com/auth/admin.directory.user.readonly

3. 检查服务账号权限

确认服务账号已被授予正确的IAM角色:

  • 推荐直接使用Directory Users Reader角色(针对用户数据只读访问),或确保User Management Admin角色包含admin.directory.user.readonly权限。

4. 优化错误处理(可选)

原脚本将所有异常判定为用户不存在,建议区分权限错误与用户不存在的情况,示例:

from googleapiclient.errors import HttpError

try:
    user = directory_service.users().get(userKey=USER_EMAIL_TO_CHECK).execute()
    print(f'用户信息:{user}')
    print(f'用户存在:{user["primaryEmail"]}')
except HttpError as e:
    if e.resp.status == 403:
        print('权限错误:当前模拟账号无访问用户数据的权限')
    elif e.resp.status == 404:
        print(f'用户不存在:{USER_EMAIL_TO_CHECK}')
    else:
        print(f'请求错误:{e}')
except Exception as e:
    print(f'未知错误:{e}')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:00:04