通过Firebase重写代理的云函数如何验证当前请求的认证用户?
如何在Firebase Rewrite代理的云函数中识别认证用户
好问题!我之前在做类似的Firebase项目时也遇到过这个困扰——默认情况下,通过rewrites路由到云函数的请求确实不会自动携带用户的认证信息,这也是你只拿到connect.sid而没有授权令牌的原因。咱们来一步步解决这个问题:
为什么默认拿不到认证用户?
Firebase Hosting的rewrites本质上是做反向代理,它不会主动把用户的Firebase Auth令牌附加到请求里。connect.sid只是Hosting用来维护自身会话的cookie,和用户的身份认证完全无关,所以没法用它来识别登录用户。
解决方法:手动传递并验证ID Token
要让云函数识别用户,需要前端主动把用户的ID Token带到请求中,然后在云函数里验证这个令牌。
1. 前端请求时携带ID Token
在发起/hello请求前,先从Firebase Auth获取当前用户的ID Token,然后通过请求头(比如Authorization)传递给云函数:
// 前端代码示例(假设已经初始化了Firebase Auth) async function callHelloFunction() { const user = firebase.auth().currentUser; if (!user) { // 处理未登录情况 alert('请先登录!'); return; } // 获取ID Token const idToken = await user.getIdToken(); // 发起请求并携带Token const response = await fetch('/hello', { method: 'GET', // 或POST,根据你的函数需求调整 headers: { 'Authorization': `Bearer ${idToken}` } }); const result = await response.text(); console.log(result); }
2. 云函数中验证ID Token并获取用户信息
在你的helloWorld云函数里,使用Firebase Admin SDK来验证请求头里的ID Token,解析出用户的UID等信息:
// 云函数代码示例 const admin = require('firebase-admin'); admin.initializeApp(); exports.helloWorld = async (req, res) => { // 检查请求头是否包含Authorization字段 const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).send('未授权:无有效令牌'); } // 提取Token const idToken = authHeader.split('Bearer ')[1]; try { // 验证Token const decodedToken = await admin.auth().verifyIdToken(idToken); const userId = decodedToken.uid; // 这里就可以使用userId做后续业务逻辑了 res.status(200).send(`Hello, 认证用户!你的UID是:${userId}`); } catch (error) { // Token验证失败 res.status(401).send('未授权:无效令牌'); } };
额外注意事项
- 确保你的云函数已经正确初始化了Firebase Admin SDK(如果是通过Firebase CLI部署的函数,通常会自动处理初始化)。
- ID Token有有效期(默认1小时),如果需要长期有效,可以考虑添加Token自动刷新的逻辑。
- 如果你的应用启用了App Check,也可以结合App Check来进一步验证请求的合法性,但这是额外的安全层,不影响用户身份识别的核心逻辑。
内容的提问来源于stack exchange,提问作者jr.
相关产品推荐
相关产品推荐

