Firebase可调用函数中如何强制刷新context.auth.token获取最新邮箱验证状态?
解决方案
方法一:前端主动刷新ID Token后再调用函数
前端完成邮箱验证并reload用户信息后,当前持有的ID Token仍为旧版本(未同步邮箱验证状态),需强制刷新ID Token再调用可调用函数:
const user = auth.currentUser; user.reload().then(async () => { // 强制刷新ID Token,获取包含最新验证状态的凭证 const freshIdToken = await user.getIdToken(true); console.log(user.emailVerified); // 此时已返回true // 调用可调用函数时,Firebase会自动使用新的ID Token const result = await firebase.functions().httpsCallable('yourFunctionName')(); });
方法二:云函数主动拉取用户最新验证状态
放弃依赖context.auth.token的缓存值,直接通过Firebase Admin SDK从服务器获取用户实时数据:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.yourFunctionName = functions.https.onCall(async (data, context) => { // 先校验用户已登录 if (!context.auth) { throw new functions.https.HttpsError("unauthenticated", "用户未登录"); } // 从Firebase Auth服务器拉取用户最新信息 const userRecord = await admin.auth().getUser(context.auth.uid); if (!userRecord.emailVerified) { throw new functions.https.HttpsError("failed-precondition", "用户必须验证邮箱"); } // 后续业务逻辑 return { message: "验证通过,执行操作" }; });
问题原因解释
context.auth.token的数据来自客户端发送的ID Token,而ID Token默认有效期为1小时,邮箱验证状态更新后,旧Token不会自动同步新状态。前端调用user.reload()仅刷新了本地用户实例的状态,但未更新当前持有的ID Token,导致云函数收到旧Token时读取到未更新的email_verified字段。
通过前端强制刷新ID Token,或云函数主动拉取用户实时数据,均可绕过缓存获取最新验证状态,无需等待1-2分钟的缓存同步时间。
内容的提问来源于stack exchange,提问作者B Meirelles
相关产品推荐
相关产品推荐

