Firebase Auth如何通过自定义token创建会话Cookie且无需客户端参与
问题根因
auth.createSessionCookie() 方法仅接受用户登录后签发的 Firebase ID Token 作为入参,而auth.createCustomToken()生成的是专门用于触发登录流程的自定义签名凭证,二者的签名规则、使用场景完全不同,所以直接传入会触发The provided ID token is not a valid Firebase ID token.报错。
服务端无客户端参与的实现方案
你可以在服务端直接调用Firebase身份验证的REST接口,用自定义Token换取有效的ID Token,全程不需要客户端介入,步骤如下:
前置准备
从Firebase控制台「项目设置」-「常规」页面获取你的项目Web API密钥,记为FIREBASE_WEB_API_KEY。
完整实现代码
const fetch = require('node-fetch'); // Node18+无需安装,可直接使用原生fetch // 原有用户创建/更新逻辑不变 await auth.updateUser(uid, authUser).catch(error => { if (error.code === "auth/user-not-found") { return auth.createUser(authUser); } throw error; }); // 生成自定义Token const customToken = await auth.createCustomToken(uid); // 服务端调用REST接口换取ID Token const signInResponse = await fetch(`https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=${FIREBASE_WEB_API_KEY}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: customToken, returnSecureToken: true }) }); const signInData = await signInResponse.json(); const idToken = signInData.idToken; // 这里拿到有效的Firebase ID Token // 用ID Token生成会话Cookie,原有逻辑不变 const sessionCookie = await auth.createSessionCookie(idToken, { expiresIn }); const decodedClaims = await auth.verifySessionCookie(sessionCookie); const user = await auth.getUser(decodedClaims.uid); setCookie(res, COOKIE_SESSION, sessionCookie, { maxAge: expiresIn });
注意事项
- 接口返回的ID Token默认有效期为1小时,拿到后直接调用
createSessionCookie即可,无需持久化存储 - Web API密钥为项目敏感信息,仅可在服务端环境使用,不要泄露到前端代码中
内容的提问来源于stack exchange,提问作者Johnny Kontrolletti
相关产品推荐
相关产品推荐

