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

能否用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:55:32