使用Firebase验证用户会话时触发auth/invalid-custom-token错误
问题原因及解决方案
你遇到的auth/invalid-custom-token错误核心原因是混淆了ID Token与自定义令牌(Custom Token)的用途:
getIdToken(true)获取的是Firebase Auth颁发的ID Token,作用是让客户端向服务器证明用户身份,并非自定义令牌。signInWithCustomToken()仅接受后端通过Firebase Admin SDK生成的自定义令牌,直接传入ID Token必然触发无效令牌错误。
正确的会话验证方式
如果你的需求是验证用户ID Token的有效性,无需调用signInWithCustomToken,直接使用Firebase Admin SDK的verifyIdToken方法即可:
const admin = require('firebase-admin'); // 确保已完成Firebase Admin SDK初始化配置 async function validateUserToken(idToken) { try { // 验证并解码ID Token,获取用户信息 const decodedToken = await admin.auth().verifyIdToken(idToken); // 验证通过,decodedToken包含用户UID、邮箱、过期时间等信息 return decodedToken; } catch (error) { // 处理验证失败场景(如令牌过期、伪造等) console.error('令牌验证失败:', error.code); throw error; } }
若需使用自定义令牌(自定义认证场景)
如果确实需要生成自定义令牌供客户端登录,需通过Admin SDK的createCustomToken方法生成:
// 从登录成功的userCredential中获取用户UID const uid = userCredential.user.uid; // 生成自定义令牌 const customToken = await admin.auth().createCustomToken(uid); // 将customToken返回给客户端,即可用signInWithCustomToken完成登录 await signInWithCustomToken(auth, customToken);
核心概念区分
- ID Token:短期有效令牌(默认1小时),由Firebase Auth自动颁发,用于客户端向后端证明身份,后端通过
verifyIdToken验证即可。 - 自定义令牌:由后端生成,用于对接自有用户系统等自定义认证场景,客户端通过它获取Firebase Auth的合法会话。
内容的提问来源于stack exchange,提问作者ColonelHedgehog
相关产品推荐
相关产品推荐

