能否用Directory API与服务账号文件获取Workspace邮箱地址?
使用服务账号JSON文件通过Admin SDK Directory API获取Google Workspace邮箱地址
完全可以通过服务账号JSON文件结合Admin SDK Directory API实现需求,这种方式无需手动更新令牌,适合在Google Cloud Function这类无服务器环境中运行。下面是具体实现方案:
前置配置
- 创建并配置服务账号:在Google Cloud控制台创建服务账号,下载对应的JSON密钥文件。
- 启用域范围委派:在服务账号详情页开启"域范围委派",记录服务账号的客户端ID。
- 授权API范围:登录Google Workspace管理控制台,进入"安全 > API控制 > 域范围委派",添加服务账号的客户端ID,并授权以下API范围:
https://www.googleapis.com/auth/admin.directory.user.readonly(仅读取用户数据,更安全)- 若需要修改用户数据可使用
https://www.googleapis.com/auth/admin.directory.user
- 指定模拟用户:选择一个拥有Workspace管理员权限的邮箱作为服务账号的模拟对象(服务账号将以该管理员身份调用API)。
Google Cloud Function 实现代码
from google.oauth2.service_account import Credentials from googleapiclient.discovery import build # API 范围,根据需求选择 SCOPES = ['https://www.googleapis.com/auth/admin.directory.user.readonly'] # 模拟的Workspace管理员邮箱 ADMIN_EMAIL = 'admin@your-domain.com' def get_workspace_users(request): # 加载服务账号凭证,云函数中推荐将JSON内容存入环境变量 # 环境变量方式示例: # import os # import json # service_account_info = json.loads(os.environ['SERVICE_ACCOUNT_JSON']) # creds = Credentials.from_service_account_info(service_account_info, scopes=SCOPES, subject=ADMIN_EMAIL) # 直接读取密钥文件(部署时需将JSON文件打包到云函数中,生产环境不推荐) creds = Credentials.from_service_account_file( 'service-account-key.json', scopes=SCOPES, subject=ADMIN_EMAIL ) # 构建Admin SDK服务实例 service = build('admin', 'directory_v1', credentials=creds) # 分页获取所有用户(处理超过单页返回上限的情况) all_users = [] page_token = None while True: results = service.users().list( customer='my_customer', orderBy='email', pageToken=page_token, maxResults=500 # 单次请求最大返回数,可按需调整 ).execute() users = results.get('users', []) all_users.extend(users) page_token = results.get('nextPageToken') if not page_token: break # 提取所有用户的主邮箱地址 user_emails = [user['primaryEmail'] for user in all_users] # 返回结果,可根据云函数需求调整返回格式 return { 'total_users': len(all_users), 'user_emails': user_emails }
关键说明
- 服务账号通过域范围委派模拟Workspace管理员身份,从而获取整个域的用户数据访问权限。
- 代码实现了分页逻辑,确保能完整获取所有用户(原示例仅返回10条数据)。
- 在Google Cloud Function中部署时,优先使用环境变量存储服务账号JSON内容,避免密钥文件暴露风险。
- 需确保云函数的运行账号具备读取服务账号密钥的权限,或确认密钥文件已正确包含在部署包中。
内容的提问来源于stack exchange,提问作者Utsab Subedi
相关产品推荐
相关产品推荐

