保护 Firebase HTTP onCall 函数

Posted

技术标签:

【中文标题】保护 Firebase HTTP onCall 函数【英文标题】:Securing Firebase HTTP onCall-Functions 【发布时间】:2019-01-26 13:30:17 【问题描述】:

我已将旧的不安全的 http-request-functions 替换为 onCall-functions。我已经阅读了有关新功能的纪录片,并且客户端会在函数的上下文中自动发送身份验证数据。 我想知道我应该如何处理这个 context.auth?

我目前认为,如果我只是将 context.auth.uid 与数据库中应该发生某些事情的用户 ID 进行比较,那么知道 url 和用户 ID 的人可能会伪造请求。请参阅下面的代码。

    exports.sampleFunction = functions.https
      .onCall((data, context) => 
        const userID = data.userID;
        const authID = context.auth.uid;
        console.log("userID is: " + userID);
        console.log("request is authentificated? :" + authID);

        if (!userID || !authID) 
          console.log("wrong request");
          throw new functions.https.HttpsError(
            "OPERATION_FAILED",
            "OPERATION_FAILED"
          );
         else if (userID !== authID) 
          console.log("is this save ?");
          throw new functions.https.HttpsError(
            "OPERATION_FAILED",
            "OPERATION_FAILED"
          );
         else 
                 // Run the function
                const userPromise = admin
                        .database()
                        .ref("UserInfo")
                        .child(userID)
                        .once("value");
        
    

【问题讨论】:

我不明白你想在这里完成什么。当在 context.auth 中始终可用时,在数据对象中传递 uid 有什么意义?只要相信 context.auth.uid 的值。 【参考方案1】:

只是一个想法,但是如何添加另一个函数,它使用新生成的(在另一台服务器上生成)更新用户的“API 密钥” - 然后将新的密钥用于以下请求?高频密钥轮换不会阻止任何人获取这样的 URL,但它会使该信息很快变得无用(其中“很快”表示更新频率,由该其他服务器上的 cronjob 的间隔定义)。

【讨论】:

【参考方案2】:

你可以做的是,检查用户是否登录。这将帮助您保护这些功能。

第 1 步:在从客户端调用 http 函数之前,将当前记录的用户令牌附加到 http 标头。见下图。

第 2 步:在云函数中,在执行 http 处理之前,调用一个方法来检查用户是否登录以及令牌 ID(当前登录的用户令牌 ID)。请参阅下图了解如何在处理传入的 http 调用并返回响应之前对其进行验证。

第 3 步:只需在 http 请求上调用该函数。见下图。

注意:为了保护您的数据,您应该只允许当前登录的用户访问已登录的用户和公共数据,而不是敏感数据。你应该把它写在规则选项卡中。

对于您的场景,例如用户拥有 url,如果他尝试在浏览器选项卡中访问它,他会收到类似“抱歉!您有权访问url" 如果您在访问服务之前使用上述方法(Http 函数)。

希望对你有所帮助。

【讨论】:

以上是关于保护 Firebase HTTP onCall 函数的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:如何调用 https.onCall 函数 node.js?

Firebase 云功能 - onCall 不起作用

错误:包装函数仅适用于 `onCall` HTTP 函数,不适用于 `onRequest`

Firebase Cloud Functions https.onCall 完成状态码:204

Firebase + Flutter - 云函数 onCall 导致 Android 应用出现“未经身份验证”错误

错误:响应不是具有 onCall 的 firebase 函数上的有效 JSON 对象