从Google AppScript调用带身份验证的Cloud Function报401错误如何解决?
排查步骤
- 验证令牌受众有效性
将AppScript中生成的身份令牌复制到JWT解析工具中查看aud字段,确认该字段值与你的Cloud Function完整访问URI完全一致,没有多余斜杠、路径后缀或者协议错误。注意:默认无参调用ScriptApp.getIdentityToken()生成的令牌受众是AppScript本身的部署地址,并非Cloud Function地址,这是最常见的触发401的原因 - 验证调用身份IAM权限
确认你发起AppScript调用的身份(个人账号或AppScript默认服务账号)已被授予目标Cloud Function的roles/cloudfunctions.invoker权限,此前你使用自定义服务账号调用成功不代表AppScript使用的身份有对应权限。
解决方案
1. 修正令牌生成逻辑
将AppScript代码中获取身份令牌的逻辑修改为指定Cloud Function地址为受众:
const token = ScriptApp.getIdentityToken({ aud: cloud_function_uri });
不要使用ScriptApp.getOAuthToken()生成的OAuth2访问令牌,Cloud Function的HTTP触发校验要求传入带正确受众的OIDC身份令牌。
2. 配置IAM调用权限
二选一执行即可:
方案1:给个人账号授权
适合个人调试场景,在Google Cloud Shell中执行以下命令,替换对应占位符:
gcloud functions add-iam-policy-binding <你的Cloud Function名称> \ --region=<你的Cloud Function部署区域> \ --member=user:<你运行AppScript的Google账号邮箱> \ --role=roles/cloudfunctions.invoker
方案2:给AppScript服务账号授权
适合正式部署场景,首先打开AppScript项目的「项目设置」页,复制页面展示的默认服务账号邮箱,再执行以下命令:
gcloud functions add-iam-policy-binding <你的Cloud Function名称> \ --region=<你的Cloud Function部署区域> \ --member=serviceAccount:<你复制的AppScript服务账号邮箱> \ --role=roles/cloudfunctions.invoker
完成以上两步操作后重新调用即可解决401错误。如果仍有异常,可以打印响应头的WWW-Authenticate字段定位具体错误原因。
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

