调用 Firebase 的 `.onCall()` 方法时如何防止“错误请求”?

imj*_*red 8 firebase google-cloud-functions

我刚刚升级到使用 Firebase Cloud Functions v1.x。根据这个答案

可调用函数与 HTTP 函数完全相同

考虑到这一点,我尝试转换我的 pre-1.x 模拟代码:

export const myHttpAction = functions.https.onRequest((req, res) => {
  try {
    const result = await myHttpActionWorker(req.body);
    return res.send({ status: 'OK' });
  } catch (err) {
    console.error(err);
    return res.status(500).send({ status: 'Server error' });
  }
});
Run Code Online (Sandbox Code Playgroud)

到以下几点:

export const myHttpAction = functions.https.onCall(async (data, context) => {
  console.log(context.auth);
  try {
    const result = await myHttpActionWorker(data);
    return { status: 'OK' };
  } catch (err) {
    console.error(err);
    return { status: 'Server error' };
  }
});
Run Code Online (Sandbox Code Playgroud)

但是在提交到我的端点后/myHttpAction,使用我在 1.x 之前使用的相同数据,我得到以下回复:

{
  "error": {
    "status": "INVALID_ARGUMENT",
    "message": "Bad Request"
  }
}
Run Code Online (Sandbox Code Playgroud)

我不确定为什么请求是“坏的”,因为它完全相同,而 Callable 函数“完全相同”。知道是什么给的吗?

我的 package.json 指定了"firebase-functions": "^1.0.1".

Dou*_*son 5

您误解了“完全相同”的含义(并省略了答案的其余部分!)。它们在安全性方面是相同的(正如最初的问题所问的那样),因为可调用函数一个 HTTP 函数,在由可调用客户端 SDK 管理的幕后进行了额外的工作。答案列出了这些差异。这些差异对安全性没有任何影响。但是您不能简单地为 HTTP 函数交换一个可调用对象,并期望现有调用者的所有内容都相同。

如果您想在不使用客户端 SDK 的情况下调用可调用函数,则必须遵循其协议规范。有关的文档即将发布,但您可以在此处获得基础知识:

如何使用 HTTP 调用 Firebase 可调用函数?