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

时间:2018-04-19 21:45:47

标签: firebase google-cloud-functions

我刚刚升级到使用Firebase云功能v1.x.根据{{​​3}}

  

可调用函数与HTTP函数

完全相同

考虑到这一点,我试图转换我的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' });
  }
});

以下内容:

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' };
  }
});

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

{
  "error": {
    "status": "INVALID_ARGUMENT",
    "message": "Bad Request"
  }
}

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

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

1 个答案:

答案 0 :(得分:2)

你误解了“完全相同”的含义(并省略了答案的全部内容!)。它们在安全性方面是相同的(正如原始问题所要求的那样),因为可调用函数一个HTTP函数,在可调用客户端SDK管理的幕后有额外的东西。答案列出了这些差异。这些差异对安全性没有任何影响。但是你不能简单地在一个HTTP函数的callable中交换,并期望现有的调用者的一切都是相同的。

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

How to call Firebase Callable Functions with HTTP?