首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >云运行试图访问服务帐户获得- 401未经授权的AndroidPublisher

云运行试图访问服务帐户获得- 401未经授权的AndroidPublisher
EN

Stack Overflow用户
提问于 2021-11-01 04:04:13
回答 1查看 240关注 0票数 1

我有一个ktor kotlin容器在Google上愉快地运行,它使用Firebase管理库访问一个Firebase数据库,这一切都很好。

随后,我们将订阅添加到我们的Android应用程序中,并希望在更新了一些内容之后,在云运行容器上执行最终确认。我做了以下几件事:

  1. 我用“服务帐户用户”创建了一个服务帐户。
  2. 允许访问Google控制台上的服务帐户--只允许访问“金融数据”(我还授予了服务完全管理权限,但错误仍然存在)。
  3. 我已经改变了每一个订阅的价格(货币化->订阅),因为谷歌上的一些帖子认为这可能有效。

我们正在从Android应用程序中发送一个有效的购买令牌,但是继续得到:

代码语言:javascript
复制
401 Unauthorized
POST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.app.name/purchases/subscriptions/sub_monthly_5_test/tokens/lbggdfiogmjfkiihemijkphc.AO-J1Owrl-ZrgJECocKyAOwxcrgtWxx-5Bbl_MD0ac4s1uGTZVE05TX1iIX-H6Vd6wxEsCTF9DVHrhVEDxpNET_MDeiNjWStyxp9d4wi3DwdZKv7vNxyMv0:acknowledge

当尝试访问时。下面是相关的gradle导入和代码的副本:

代码语言:javascript
复制
    implementation( "com.google.apis:google-api-services-androidpublisher:v3-rev20211021-1.32.1")
代码语言:javascript
复制
class GoogleClient {
    private fun log(message: Any) = LoggerFactory.getLogger("GoogleClient").info(message.toString())

    private lateinit var androidPublisher: AndroidPublisher

    init {
        try {
            log("GoogleClient init")
            val service = this::class.java.getResourceAsStream("/certs.json")
            val credentials = GoogleCredentials.fromStream(service)
                .createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER)
            androidPublisher = AndroidPublisher.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                GsonFactory.getDefaultInstance(),
                HttpCredentialsAdapter(credentials)
            ).setApplicationName("Subs backend").build()
            log("GoogleClient init success")
        } catch (e: IOException) {
            // Error logging
        }
    }

    suspend fun acknowledgePayment(productToken: String, productId) = withContext(Dispatchers.IO) {
        log("acknowledgePayment")
        val response = async {
            val content = SubscriptionPurchasesAcknowledgeRequest()
            androidPublisher.purchases().subscriptions().acknowledge("com.app.name", productId, productToken, content).execute()
            log(content)
        }
        response.await()
    }
}

为了安全起见,我更改了com.app.name,但我使用了Google仪表板中显示的应用程序的正确名称。

我还尝试创建一个服务帐户,并获得了“毯子编辑器”权限,并得到了相同的401 Unauthorized错误。

编辑:,我也很难找到与此相关的日志。

更新5/11/21:对延迟回复表示歉意-我认为权限是正确的:

来自google云控制台IAM->服务帐户的截图,

谷歌游戏控制台#1

谷歌游戏控制台#2

访问页面

我还创建了一个新的订阅,因为这显然有时会有所帮助。

EN

回答 1

Stack Overflow用户

发布于 2021-11-03 08:57:18

正如纪尧姆·布拉基尔( guillaume blaquiere )所提到的,你需要确保你的服务账户是授权的。

您可以使用gcloud auth list命令验证这一点。

如果您的帐户没有认证,您将需要遵循认证指南

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69792516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档