如何限制Firebase V2可调用函数仅允许注册用户访问?
问题
我有一个V2 Firebase可调用函数:
import { onCall } from "firebase-functions/v2/https"; /// Simple ping to test authentication exports.ping = onCall(async (req) => { return { pong: true }; });
该函数要求身份验证,不带Authorization头调用会返回401 Unauthorized,带有效的授权Bearer令牌则成功返回{pong: true}。但问题是,无论令牌属于我的应用用户还是其他Google用户,都能成功调用。我希望将访问权限限制为仅允许控制台(https://console.firebase.google.com/project/XXX/authentication/users)用户列表中的用户使用——当前控制台中没有注册用户,但我仍可使用任意有效的Google用户令牌成功调用该函数,且调用前后控制台用户列表始终为空。
请问如何限制我的V2 Firebase可调用函数仅允许控制台用户列表中的用户使用?
解决方案
Firebase可调用函数默认仅验证令牌的有效性,不会检查该用户是否在你的项目Firebase Auth系统中注册过(即出现在控制台用户列表里)。要实现限制,需在函数中添加逻辑,验证用户UID是否存在于项目的Auth用户集合中,具体步骤如下:
安装并初始化Firebase Admin SDK
如果尚未安装,先安装依赖:npm install firebase-admin在函数文件中引入并初始化Admin SDK:
import admin from "firebase-admin"; if (!admin.apps.length) { admin.initializeApp(); }修改可调用函数,添加用户存在性检查
在函数中提取用户UID,调用Admin SDK的getUser方法验证用户是否存在,不存在则抛出权限错误:import { onCall, HttpsError } from "firebase-functions/v2/https"; import admin from "firebase-admin"; if (!admin.apps.length) { admin.initializeApp(); } /// Simple ping to test authentication exports.ping = onCall(async (req) => { // 获取当前用户UID const uid = req.auth?.uid; if (!uid) { throw new HttpsError("unauthenticated", "用户未认证"); } try { // 检查用户是否存在于项目Auth列表中 await admin.auth().getUser(uid); } catch (error) { throw new HttpsError("permission-denied", "无访问权限"); } return { pong: true }; });原理说明
- 只有通过你的应用Auth流程完成注册的用户,才会被纳入Firebase Auth的用户列表(即控制台显示的用户)。
- 调用
admin.auth().getUser(uid)时,若该UID对应的用户未在项目中注册,会抛出user-not-found错误,此时函数返回权限拒绝,阻止非注册用户访问。
内容的提问来源于stack exchange,提问作者emmby
相关产品推荐
相关产品推荐

