访问需身份认证的Google Cloud Function时返回401错误如何排查
你遇到的401错误核心是Java SDK生成ID令牌时的*目标受众(target audience)*和Cloud Functions校验的预期值不匹配,这是调用GCP HTTP云函数身份认证的常见代码层面踩坑点,可按以下步骤排查修复:
步骤1:校验目标受众取值
- 传入
setTargetAudience的CF1访问地址,必须和Cloud Functions控制台「触发」标签页给出的触发URL完全一致,不要携带额外查询参数、自定义路径后缀,也要注意末尾不要多斜杠:
例:控制台给出的地址是https://us-central1-project-id.cloudfunctions.net/cf1,就不要写成https://us-central1-project-id.cloudfunctions.net/cf1/(末尾多斜杠)、https://us-central1-project-id.cloudfunctions.net/cf1?test=1(带查询参数) - 你可以将SDK生成的ID令牌和gcloud生成的ID令牌分别解析,对比payload中的
aud字段,两者必须完全一致。
步骤2:修改ID令牌生成配置
如果确认传入的目标受众地址正确但生成的aud字段仍不匹配,可显式添加配置禁用SDK对受众地址的自动格式转换,修改IdTokenCredentials的构建代码如下:
// 先去除地址前后多余空格 String targetAudience = serviceUrl.trim(); IdTokenCredentials tokenCredential = IdTokenCredentials.newBuilder() .setIdTokenProvider((IdTokenProvider) credentials) .setTargetAudience(targetAudience) // 新增该配置,禁用默认的格式转换逻辑 .setOptions(Collections.singletonList(IdTokenProvider.Option.FORMAT_DEFAULT)) .build();
步骤3:确认ADC身份正确
可在代码中打印当前凭证对应的账号信息,确认ADC加载的确实是CF2的服务账号,没有被其他账号的凭证覆盖:
if (credentials instanceof ServiceAccountCredentials) { String saEmail = ((ServiceAccountCredentials) credentials).getAccount(); // 打印saEmail和CF2服务账号邮箱对比,确认一致 }
修复后重新生成令牌测试即可正常调用CF1。
内容的提问来源于stack exchange,提问作者Seng Cheong
相关产品推荐
相关产品推荐

