保护 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?
错误:包装函数仅适用于 `onCall` HTTP 函数,不适用于 `onRequest`
Firebase Cloud Functions https.onCall 完成状态码:204