Google Workspace超级管理员如何通过API获取其他账户的Google Contacts
Google Workspace 特定账户联系人授权访问方案
一、核心授权实现方式
作为Workspace超级管理员,你有两种可靠的方式访问域内特定账户的Google Contacts:用户模拟(Impersonation)和服务账户域范围委派,具体说明如下:
1. 用户模拟(通过服务账户实现)
完全可以通过用户模拟访问目标账户的Contacts,操作步骤如下:
- 在Google Cloud控制台创建服务账户,为其启用域范围委派(Domain-Wide Delegation)。
- 以超级管理员身份登录Workspace管理控制台,进入「安全」→「API控制」→「域范围委派」,为该服务账户授权以下OAuth 2.0范围:
https://www.googleapis.com/auth/contacts.readonly(仅需读取时使用)- 若需编辑联系人,额外添加
https://www.googleapis.com/auth/contacts
- 在代码中使用服务账户密钥,模拟目标用户(如
press@....org)身份发起API请求。
示例代码(Python):
from google.oauth2 import service_account from googleapiclient.discovery import build # 服务账户密钥文件路径 SERVICE_ACCOUNT_FILE = 'path/to/your/service-account-key.json' # 要模拟的目标用户邮箱 TARGET_USER = 'press@....org' # API权限范围 SCOPES = ['https://www.googleapis.com/auth/contacts.readonly'] # 构建基础凭据 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) # 切换为目标用户身份 delegated_credentials = credentials.with_subject(TARGET_USER) # 初始化People API(Google Contacts已迁移至该API) service = build('people', 'v1', credentials=delegated_credentials) # 获取联系人列表 results = service.people().connections().list( resourceName='people/me', pageSize=100, personFields='names,emailAddresses' ).execute() contacts = results.get('connections', []) for contact in contacts: display_name = contact.get('names', [{}])[0].get('displayName', '无姓名') emails = contact.get('emailAddresses', [{}])[0].get('value', '无邮箱') print(f"{display_name}: {emails}")
2. 服务账户直接访问(配合域范围委派)
单独的服务账户没有自身的联系人数据,必须结合域范围委派+用户模拟才能访问域内用户的Contacts。这和上面的用户模拟逻辑是统一的——服务账户仅作为身份代理,实际访问权限依托于被模拟的目标用户。
二、关键注意事项
- API选型:Google Contacts API已逐步被People API替代,建议优先使用People API开发,兼容性与功能更完善。
- 权限最小化:遵循最小权限原则,仅授予必要的权限范围(如只读场景只用
readonly),降低安全风险。 - 测试验证:先在测试账户上验证权限配置与代码逻辑,再推广到生产环境的目标账户。
- 管理员权限:确保你的超级管理员账户拥有「管理API客户端访问」权限,否则无法配置域范围委派。
内容的提问来源于stack exchange,提问作者Vadim Kantorov
相关产品推荐
相关产品推荐

