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运行时的默认服务账号:
- 在Cloud Run的运行配置中,指定运行时服务账号为你已经配置了Play Console权限的服务账号
- 修改凭证加载逻辑为:
val credentials = GoogleCredentials.getApplicationDefault() .createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER)
5. 手动调用接口排查问题
你可以在本地用gcloud工具生成Access Token直接调用接口,排除代码逻辑问题:
- 本地安装gcloud后执行命令加载服务账号密钥:
gcloud auth activate-service-account --key-file=certs.json - 生成Access Token:
gcloud auth print-access-token - 用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
相关产品推荐
相关产品推荐

