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

如何从Unity调用Firebase示例云函数?是否需要认证?

问题

我已经在Unity中完成Firebase的添加与配置,现在想调用Firebase创建的示例云函数,函数代码如下:

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(message);
};

我不确定调用该函数是否需要认证?若需要,应如何调用?
我尝试用以下代码调用名为testunity的函数,但不确定是否正确:

System.Threading.Tasks.Task<string> Start()
{
    FirebaseFunctions functions = FirebaseFunctions.GetInstance(projectId);

    Debug.Log("Calling");
    var function = functions.GetHttpsCallable("testunity");
    return function.CallAsync("helloWorld").ContinueWith((task) => {
        return (string)task.Result.Data;
    });
}
回答

一、认证需求说明

你写的这个是HTTP触发类型的云函数,默认不需要认证——只要知道函数的公开URL,任何人都能调用。但如果你的项目有安全限制需求,建议开启认证:

  • 若要限制仅已登录Firebase的用户才能调用,需要在云函数中添加认证校验逻辑,同时Unity端要确保用户完成Firebase Auth登录。

二、正确调用方式

1. 无认证场景(直接用HTTP触发函数)

如果想直接调用你现有的HTTP触发函数,Unity里可以用UnityWebRequest请求函数URL:

IEnumerator CallHttpCloudFunction()
{
    // 替换成你自己的函数URL,格式是https://[区域]-[项目ID].cloudfunctions.net/helloWorld
    string functionUrl = "https://us-central1-your-project-id.cloudfunctions.net/helloWorld";
    // 传递message参数,这里用QueryString示例,也可以用POST Body
    UnityWebRequest request = UnityWebRequest.Get($"{functionUrl}?message=Unity测试调用");
    
    yield return request.SendWebRequest();

    if (request.result == UnityWebRequest.Result.Success)
    {
        Debug.Log("云函数返回结果: " + request.downloadHandler.text);
    }
    else
    {
        Debug.LogError("调用失败: " + request.error);
    }
}

2. 用Callable类型函数(更适配Firebase SDK)

如果想用Firebase的HttpsCallable方式调用,需要先把云函数改成Callable类型:

const functions = require("firebase-functions");

exports.helloWorld = functions.https.onCall((data, context) => {
    // 从传入的data中获取message参数
    let message = data.message || 'Hello World!';
    return message;
});

然后Unity端的调用代码修正为:

async void Start()
{
    FirebaseFunctions functions = FirebaseFunctions.DefaultInstance;
    try
    {
        // 用字典传递参数,和云函数的data对应
        var requestData = new Dictionary<string, object>();
        requestData["message"] = "来自Unity的Callable调用";
        
        var result = await functions.GetHttpsCallable("helloWorld").CallAsync(requestData);
        Debug.Log("返回结果: " + result.Data.ToString());
    }
    catch (Exception e)
    {
        Debug.LogError("调用出错: " + e.Message);
    }
}

3. 需要认证的场景

如果要限制仅认证用户调用,先修改云函数添加校验:

const functions = require("firebase-functions");

exports.helloWorld = functions.https.onCall((data, context) => {
    // 检查用户是否已完成Firebase认证
    if (!context.auth) {
        throw new functions.https.HttpsError('unauthenticated', '必须登录才能调用该函数');
    }
    
    let message = data.message || 'Hello World!';
    return message;
});

Unity端需要先完成Firebase Auth登录(以匿名登录为例),再调用函数:

async void Start()
{
    // 先完成匿名登录,也可以用邮箱密码、Google登录等方式
    var authResult = await FirebaseAuth.DefaultInstance.SignInAnonymouslyAsync();
    Debug.Log("用户已登录: " + authResult.User.UserId);

    // 调用带认证的云函数
    FirebaseFunctions functions = FirebaseFunctions.DefaultInstance;
    try
    {
        var requestData = new Dictionary<string, object>();
        requestData["message"] = "已认证用户的调用";
        
        var result = await functions.GetHttpsCallable("helloWorld").CallAsync(requestData);
        Debug.Log("返回结果: " + result.Data.ToString());
    }
    catch (Exception e)
    {
        Debug.LogError("调用出错: " + e.Message);
    }
}

三、你现有代码的问题

你写的代码有两个关键问题:

  • 函数名不匹配:你的云函数实际叫helloWorld,但代码里调用的是testunity,必须改成一致的名称。
  • 参数传递错误:CallAsync直接传字符串的话,云函数无法正确解析出message参数,应该用字典传递键值对形式的参数。

内容的提问来源于stack exchange,提问作者Indra Kumar Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:25:28