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

如何限制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用户集合中,具体步骤如下:

  1. 安装并初始化Firebase Admin SDK
    如果尚未安装,先安装依赖:

    npm install firebase-admin
    

    在函数文件中引入并初始化Admin SDK:

    import admin from "firebase-admin";
    
    if (!admin.apps.length) {
        admin.initializeApp();
    }
    
  2. 修改可调用函数,添加用户存在性检查
    在函数中提取用户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 };
    });
    
  3. 原理说明

    • 只有通过你的应用Auth流程完成注册的用户,才会被纳入Firebase Auth的用户列表(即控制台显示的用户)。
    • 调用admin.auth().getUser(uid)时,若该UID对应的用户未在项目中注册,会抛出user-not-found错误,此时函数返回权限拒绝,阻止非注册用户访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:41:03