保护Firebase HTTP onCall功能

时间:2018-08-20 12:06:30

标签: firebase google-cloud-functions

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

我目前正在考虑,如果我将context.auth.uid与数据库中的userID进行比较,那么知道url和userID的人可能会伪造请求。参见下面的代码。

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

2 个答案:

答案 0 :(得分:2)

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

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

enter image description here

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

enter image description here

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

enter image description here

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

对于诸如拥有url的用户之类的情况,如果他尝试在浏览器标签中访问它,则会收到类似“ 抱歉!您有权访问”的错误消息url ”,如果您在访问服务(Http函数)之前使用了上述方法。

希望这对您有所帮助。

答案 1 :(得分:1)

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