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

Firebase JWT登录实现逻辑及用户密码验证方案咨询

问题核心

你当前的后端/getToken路由仅通过邮箱查询了Firebase用户记录,没有对用户提交的密码做有效性校验,只要输入存在的邮箱就能拿到合法的自定义JWT,存在严重的越权访问风险。

标准实现方案(推荐)

你完全不需要自行封装后端接口生成自定义token,Firebase客户端SDK已经提供了成熟的邮箱密码登录+JWT获取能力,流程简化如下:

  • 前端直接调用客户端SDK的signInWithEmailAndPassword方法完成密码校验和登录
  • 登录成功后调用user.getIdToken()即可获取Firebase官方签发的有效JWT
  • 后续请求携带该JWT,后端用Firebase Admin SDK的verifyIdToken方法校验有效性即可

对应前端代码修改示例:

document.getElementById("login-form").addEventListener("submit", async (event) => {
  event.preventDefault();
  const email = event.target.email.value;
  const password = event.target.password.value;
  try {
    // 直接用客户端SDK完成密码校验+登录
    const userCredential = await firebase.auth().signInWithEmailAndPassword(email, password);
    const user = userCredential.user;
    // 获取官方签发的JWT
    const idToken = await user.getIdToken();
    // 后续业务请求携带这个idToken即可
    console.log("登录成功,JWT:", idToken);
  } catch (error) {
    console.error("登录失败:", error.code, error.message);
  }
});
若必须保留自定义Token生成流程的实现方案

如果你的业务场景确实需要后端生成自定义token,需要在后端增加密码校验逻辑:
由于Firebase Admin SDK没有直接校验用户密码的接口,你可以在后端调用Firebase Auth的公开REST接口完成密码校验,校验通过后再生成自定义token:

const axios = require('axios');
// 替换为你自己的Firebase项目Web API Key
const FIREBASE_WEB_API_KEY = '你的Web API Key';

app.post('/getToken', async (req, res) => {
  const email = req.body.email;
  const password = req.body.password;
  try {
    // 调用Firebase Auth接口校验密码正确性
    const signInRes = await axios.post(
      `https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=${FIREBASE_WEB_API_KEY}`,
      {
        email,
        password,
        returnSecureToken: true
      }
    );
    // 密码校验通过,获取uid生成自定义token
    const uid = signInRes.data.localId;
    const customToken = await admin.auth().createCustomToken(uid);
    res.json({ token: customToken });
  } catch (error) {
    console.log('校验失败:', error.response?.data?.error || error.message);
    res.status(401).json({ error: '邮箱或密码错误' });
  }
});

同时需要修正你现有前端代码的响应解析逻辑问题:

const getToken = async () => {
  console.log(login, password);
  const response = await fetch('/getToken', { 
    method: 'POST', 
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }, 
    body: JSON.stringify({ email: login, password: password }) 
  });
  const resData = await response.json();
  if (!response.ok) throw new Error(resData.error);
  // 用返回的自定义token登录
  const userCredential = await firebase.auth().signInWithCustomToken(resData.token);
  const user = userCredential.user;
  // 后续业务逻辑
}
getToken();

内容的提问来源于stack exchange,提问作者Vaibhav07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 03:27:04