如何从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
相关产品推荐
相关产品推荐

