You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 16:24:00