Firebase邮箱密码登录下,如何区分不同账号的Google Play订阅状态?
问题分析与解决方案
核心问题在于订阅绑定Google账号,而你的服务权限绑定Firebase账号,两者未做关联校验,导致用户切换Firebase账号时,只要当前设备登录的Google账号有订阅,应用就会误判权限。以下是具体解决步骤:
1. 强制关联Google账号与Firebase账号
确保用户的Firebase账号必须和购买订阅的Google账号绑定:
- 如果用户用非Google方式登录Firebase(如邮箱),增加「关联Google账号」流程,要求用户使用购买订阅的Google账号完成关联;
- 优先引导用户通过Firebase Auth的Google登录方式注册/登录,直接将Firebase UID与Google账号ID绑定。
2. 购买时标记订阅归属
发起订阅购买请求时,将当前Firebase用户关联的Google账号ID传入obfuscatedAccountId,让Google Play记录该订阅的归属账号:
// 获取当前Firebase用户关联的Google账号ID val currentFirebaseUser = FirebaseAuth.getInstance().currentUser val linkedGoogleAccountId = currentFirebaseUser?.providerData?.find { it.providerId == "google.com" }?.uid // 构建购买参数时传入账号标记 val billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .setObfuscatedAccountId(linkedGoogleAccountId) // 绑定订阅与Google账号 .build() billingClient.launchBillingFlow(activity, billingFlowParams)
3. 校验订阅与当前Firebase账号的匹配性
修改订阅状态检查逻辑,不仅验证订阅有效性,还要确认该订阅属于当前Firebase账号关联的Google账号:
val currentFirebaseUser = FirebaseAuth.getInstance().currentUser val linkedGoogleAccountId = currentFirebaseUser?.providerData?.find { it.providerId == "google.com" }?.uid billingClient.queryPurchasesAsync(params) { billingResult, purchases -> if (billingResult.responseCode == BillingResponseCode.OK) { purchases.any { purchase -> purchase.purchaseState == PurchaseState.PURCHASED && purchase.isAcknowledged && // 关键:校验订阅归属的Google账号与当前Firebase绑定的账号一致 linkedGoogleAccountId != null && purchase.accountIdentifiers?.obfuscatedAccountId == linkedGoogleAccountId } } }
4. 后端做最终权限校验(必加,防客户端篡改)
客户端校验可被绕过,必须在Firebase Cloud Functions中做最终验证:
- 客户端请求服务(如生成求职信)时,携带
purchaseToken和当前Firebase UID; - 后端调用Google Play Developer API的
purchases.subscriptions:get接口,验证purchaseToken的有效性; - 同时校验返回结果中的
obfuscatedAccountId是否与该Firebase用户绑定的Google账号ID一致; - 只有双重验证通过,才允许用户使用付费服务。
5. 账号切换时重置状态
当用户切换Firebase账号时,立即清空本地订阅状态缓存,重新执行订阅校验流程,避免缓存导致的权限误判。
内容的提问来源于stack exchange,提问作者Yauheni Mokich
相关产品推荐
相关产品推荐

