AWS Python Lambda集成Google API的令牌刷新及相关技术问题
Google Campaign Manager 360 与 AWS Lambda Python 集成问题解答
1. AWS Lambda 后台运行时的令牌刷新处理及示例
对于无交互的后台Lambda场景,优先使用Google服务账号(而非用户OAuth2授权码模式),因为服务账号无需用户手动授权,可直接通过JWT签名获取访问令牌,且Google官方库会自动处理令牌生命周期。如果必须沿用原用户授权的OAuth2流程,需存储持久化的刷新令牌,结合google-auth/google-auth-oauthlib库自动完成刷新。
服务账号模式示例(推荐)
- 在Google Cloud控制台创建服务账号,下载JSON密钥文件,将密钥内容存入AWS Secrets Manager(避免硬编码)。
- Lambda代码示例:
import boto3 from google.oauth2 import service_account from googleapiclient.discovery import build # 从Secrets Manager获取服务账号密钥 def get_service_account_key(): secrets_manager = boto3.client('secretsmanager') response = secrets_manager.get_secret_value(SecretId='google-service-account-key') return eval(response['SecretString']) # 初始化Campaign Manager服务 def init_cm_service(): credentials = service_account.Credentials.from_service_account_info( get_service_account_key(), scopes=['https://www.googleapis.com/auth/dfareporting'] ) # 官方库会自动刷新过期的访问令牌 return build('dfareporting', 'v4', credentials=credentials) def lambda_handler(event, context): cm_service = init_cm_service() # 调用Campaign Manager API拉取报告 reports = cm_service.reports().list(profileId='YOUR_PROFILE_ID').execute() # 后续存入S3逻辑...
用户授权模式(需刷新令牌)
如果必须使用用户OAuth2授权,需先通过授权流程获取刷新令牌(长期有效,除非用户撤销授权),将刷新令牌、客户端ID、客户端密钥存入Secrets Manager,代码示例:
import boto3 from google.oauth2.credentials import Credentials from googleapiclient.discovery import build import requests def get_oauth_credentials(): secrets_manager = boto3.client('secretsmanager') secret = eval(secrets_manager.get_secret_value(SecretId='google-oauth-secrets')['SecretString']) credentials = Credentials( token=None, refresh_token=secret['refresh_token'], client_id=secret['client_id'], client_secret=secret['client_secret'], token_uri='https://oauth2.googleapis.com/token', scopes=['https://www.googleapis.com/auth/dfareporting'] ) # 自动刷新访问令牌 if not credentials.valid: credentials.refresh(requests.Request()) return credentials def lambda_handler(event, context): credentials = get_oauth_credentials() cm_service = build('dfareporting', 'v4', credentials=credentials) # 后续逻辑...
2. 集成登录的难度及耗时
这里的集成登录指让SA分析师通过OAuth2授权给Lambda应用的流程:
- 难度中等:需要配置Google OAuth2客户端(设置授权回调URL,比如用API Gateway作为回调端点),处理授权码交换令牌的逻辑,还要实现令牌的持久化存储(比如Secrets Manager或DynamoDB,按用户区分令牌)。
- 耗时:如果熟悉AWS API Gateway、Google OAuth配置,大概1-2个工作日可完成。主要耗时点在回调端点的搭建、令牌存储逻辑、权限范围的验证。
但更推荐直接用服务账号模式,无需集成登录,只要给服务账号分配Campaign Manager的对应权限即可,效率更高。
3. 是否可仅通过Rest API和Bearer令牌实现集成
技术上完全可行,但不推荐。
- 可行点:你可以手动调用Google OAuth2令牌接口获取访问令牌(服务账号用JWT签名请求,用户模式用刷新令牌换令牌),然后在每个API请求的Header里带上
Authorization: Bearer <token>,直接调用Campaign Manager的Rest API。 - 不推荐原因:需要自己处理令牌过期检测、刷新逻辑,服务账号模式还要手动生成JWT签名,容易出现签名错误、令牌过期未处理等问题。Google官方的
google-auth和google-api-python-client库已经封装了所有这些细节,稳定性和可维护性更高。
内容的提问来源于stack exchange,提问作者Anthony Williams
相关产品推荐
相关产品推荐

