使用signInWithCustomToken()认证Firestore遇权限拒绝问题求助
问题原因
你的Firestore规则中isValidUser函数要求request.auth.role == 'user',但云函数生成自定义token时,仅传入用户ID作为uid,未将role作为自定义声明添加到token中。这导致Firebase Auth验证后,用户对象不存在role字段,规则验证失败,触发权限拒绝错误。
最小改动解决方案
只需修改云函数中生成自定义token的代码,在createCustomToken方法中添加自定义声明参数,传入用户角色:
// 修改云函数的token生成逻辑 const firebaseToken = await admin.auth().createCustomToken(uuid, { role: 'user' }); return res.status(200).json({status: true, token: firebaseToken, id: uuid});
逻辑说明
当用户通过signInWithCustomToken登录后,Firebase Auth会自动解析token中的自定义声明,此时request.auth.role会被正确赋值为'user',Firestore规则中的isValidUser函数将返回true,权限验证通过。
可选验证方式(Flutter端)
若需确认自定义声明是否生效,可在登录后添加以下代码检查用户信息:
User? user = FirebaseAuth.instance.currentUser; if (user != null) { await user.getIdTokenResult().then((idTokenResult) { print('用户角色:${idTokenResult.claims?['role']}'); }); }
若控制台输出用户角色:user,说明自定义声明已正确生效。
内容的提问来源于stack exchange,提问作者Lynob
相关产品推荐
相关产品推荐

