【问题标题】:Firestore cloud functions http requestFirestore 云函数 http 请求
【发布时间】:2021-04-11 00:13:24
【问题描述】:

我有一个 rest api,这是终点:

app.post('/Follow/:myUserId/:userId', async (req, res))

这个例子激活了授权: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js

一切都按预期工作,但我怀疑已经通过 firebase 身份验证并获得用户 ID 的人是否可以调用该端点和“假追随者”。

假设 Id: 12121 (myUserId) 已通过身份验证并开始调用该端点并将 id 4444 (myUserId) 和 5555 (userId) 传递给它

用户可以通过 req.user 在 rest 调用中访问,将其放在我的端点中就足够了:

app.post('/Follow/:myUserId/:userId', async (req, res) => {
    if (req.user.Id !== myUserId) {
       res.status(403).send('Unauthorized');
       return null;
    }
});

这会解决问题,还是做数据库触发器更好?

【问题讨论】:

  • 您好,有多种方法可以对用户进行身份验证以访问云功能端点。我收到了一个相关的帖子here,他们在那里讨论了验证端点的可能方法。希望这会有所帮助!
  • 是的,我已经这样做了以保护端点。我的问题是另一个原因

标签: google-cloud-platform google-cloud-firestore google-cloud-functions


【解决方案1】:

云功能仅在对文档进行更改后才会触发 Firestore 事件。在您的情况下,更新文档并在用户未经授权执行操作时恢复可能会产生额外的开销。

您的 sn-p 在没有开销方面更好,但问题是任何人都可以伪造 req.user.Id 以匹配 myUserId,因此没有规定如此。

解决方案可以是您发布的文档中提到的,以使用令牌授权用户。所以

  1. 您从授权的 firebase 令牌中获取 user.id(在请求标头中传递)

  2. 现在您可以将 id 与 myUserId 进行匹配,以确定用户是否有权执行该操作。

    const decodedIdToken = await admin.auth().verifyIdToken(idToken); req.user = decodedIdToken;

在数据库级别执行的另一种方法是使用规则(而不是触发器),如 here 所述。

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 2018-03-30
    • 1970-01-01
    • 2017-12-24
    • 2019-03-22
    • 2019-01-08
    • 2019-01-27
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多