使用Stripe支付Firebase扩展时Product metadata未同步到auth用户实例怎么办
解决方案
要将Stripe Product里配置的userRole同步到auth.currentUser的IdToken声明中,核心是把Firestore中存储的订阅元数据写入Firebase Auth的自定义声明,可按以下步骤操作:
方法一:自定义云函数同步(适配你自定义的userRole元数据)
- 编写Firestore云函数触发器,监听订阅文档的新增、更新、删除事件,自动同步角色到Auth声明
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); // 监听对应用户下的订阅文档变动 exports.syncRoleToAuthClaims = functions.firestore .document('users/{uid}/subscriptions/{subscriptionId}') .onWrite(async (change, context) => { const userUid = context.params.uid; const latestSub = change.after.exists ? change.after.data() : null; // 订阅已删除时清空角色声明 if (!latestSub) { await admin.auth().setCustomUserClaims(userUid, { userRole: null }); return; } // 读取订阅元数据中的userRole字段写入自定义声明 const targetRole = latestSub.metadata?.userRole; if (targetRole) { await admin.auth().setCustomUserClaims(userUid, { userRole: targetRole }); } });
- 在Firebase CLI中执行命令部署云函数:
firebase deploy --only functions - 你当前前端的
isUserPremium函数无需额外修改,调用getIdToken(true)会强制刷新本地Token,拉取最新的声明字段。
方法二:复用Stripe扩展内置的角色同步能力
你也可以不用自行开发云函数,直接用扩展自带的角色同步逻辑:
- 在Stripe对应产品的价格(Price)配置中添加元数据
stripeRole: premium - 扩展会自动将该字段同步到用户Auth的自定义声明中,直接启用你代码中注释的判断逻辑即可:
return decodedToken?.claims?.stripeRole ? true : false;
内容的提问来源于stack exchange,提问作者Ryland King
相关产品推荐
相关产品推荐

