Firebase auth.currentUser多用户登录问题:如何获取各终端用户专属信息?
问题原因与解决方法
首先明确:Firebase Auth的auth.currentUser是每个客户端会话独立存在的,不同设备/浏览器的登录状态不会互相覆盖。你遇到的问题,本质是后端错误地用了全局的Auth实例来获取用户,导致多用户请求时状态被混淆。
核心问题
你的后端代码里直接调用auth.currentUser,但这个auth是后端全局共享的实例。后端同时处理多个用户请求时,全局变量会被最后一个登录的用户信息覆盖,所以所有请求都会拿到最新登录的用户,而非当前请求对应的用户。
正确解决方案:用ID Token验证用户身份
后端不能依赖全局的auth.currentUser,应该让客户端在登录后携带ID Token,后端通过验证Token来获取当前请求对应的用户信息,步骤如下:
1. 后端初始化Firebase Admin SDK
先确保后端已经配置了Admin SDK(用于验证ID Token):
const admin = require('firebase-admin'); const serviceAccount = require('./你的服务账号密钥路径.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });
2. 修改客户端登录逻辑,存储ID Token到Cookie
登录成功后,获取用户的ID Token,并存入HttpOnly Cookie(更安全):
auth.signInWithEmailAndPassword(email, password) .then(async (userCredential) => { const idToken = await userCredential.user.getIdToken(); // 存储ID Token到Cookie,后端可读取 document.cookie = `idToken=${idToken}; path=/; HttpOnly; Secure`; window.location.href = state; }) .catch((error) => { var errorMessage = error.message; // 跳回登录页并携带错误信息 window.location.href = `/login?error=${encodeURIComponent(errorMessage)}`; });
3. 后端添加身份验证中间件
写一个中间件,从Cookie中取出ID Token,验证后将用户信息挂载到请求对象:
// 身份验证中间件 async function authenticate(req, res, next) { const idToken = req.cookies.idToken; if (!idToken) { return res.redirect('/login'); } try { // 验证并解码ID Token const decodedUser = await admin.auth().verifyIdToken(idToken); req.user = decodedUser; // 后续路由可通过req.user获取当前用户 next(); } catch (err) { console.error('Token验证失败:', err); return res.redirect('/login'); } }
4. 保护需要用户身份的路由
在需要用户信息的路由上使用中间件,即可获取当前请求的专属用户信息:
// 示例:需要登录的页面路由 app.get('/user-profile', authenticate, (req, res) => { // req.user就是当前请求的用户信息,每个请求独立 res.render('user-profile', { user: req.user }); });
为什么这么做?
每个客户端登录后生成的ID Token是唯一且绑定当前用户的,后端通过验证Token就能精准获取当前请求对应的用户,完全避免了全局变量导致的状态混淆问题,同时也符合前后端分离的身份验证最佳实践。
内容的提问来源于stack exchange,提问作者FattyDev1
相关产品推荐
相关产品推荐

