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

Cloud Run使用服务账号访问AndroidPublisher返回401未授权如何解决

可行解决方案

1. 优先排查权限生效延迟问题

Google Play Console的服务账号权限配置存在最长48小时的生效延迟,完成权限配置后不要立刻测试,等待24小时后再尝试调用接口,这是该场景下401错误最常见的诱因。

2. 验证服务账号密钥有效性与加载逻辑

  • 确认你打包到Cloud Run镜像中的certs.json是对应目标服务账号的正确密钥文件,没有填错或者替换错误
  • 在你现有代码的异常捕捉分支补充完整的错误日志,避免吞掉凭证加载失败的异常:
catch (e: IOException) {
    log("GoogleClient init failed: ${e.message}", e)
    throw e // 避免初始化失败后续调用空指针
}
  • 增加空校验判断资源文件是否加载成功:
val service = this::class.java.getResourceAsStream("/certs.json") ?: run {
    log("certs.json not found in resources")
    throw RuntimeException("Missing service account certs")
}

3. 升级Android Publisher客户端依赖

你当前使用的2021版客户端存在版本过旧的问题,升级到最新稳定版即可避免旧版本的鉴权兼容问题:

implementation("com.google.apis:google-api-services-androidpublisher:v3-rev20240514-2.0.0")

4. 改用Cloud Run默认服务账号(可选,更安全)

你可以不用打包密钥文件到镜像,直接复用Cloud Run运行时的默认服务账号:

  1. 在Cloud Run的运行配置中,指定运行时服务账号为你已经配置了Play Console权限的服务账号
  2. 修改凭证加载逻辑为:
val credentials = GoogleCredentials.getApplicationDefault()
    .createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER)

5. 手动调用接口排查问题

你可以在本地用gcloud工具生成Access Token直接调用接口,排除代码逻辑问题:

  1. 本地安装gcloud后执行命令加载服务账号密钥:
    gcloud auth activate-service-account --key-file=certs.json
  2. 生成Access Token:
    gcloud auth print-access-token
  3. 用curl发送请求验证:
curl -X POST "https://androidpublisher.googleapis.com/androidpublisher/v3/applications/你的实际包名/purchases/subscriptions/sub_monthly_5_test/tokens/你的购买Token:acknowledge" \
-H "Authorization: Bearer 你刚才生成的Token"

如果该请求依然返回401,说明是账号权限配置问题,如果请求成功,说明是你服务部署或者代码逻辑的问题。


内容的提问来源于stack exchange,提问作者DrZaphod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:57:06