Firebase 如何提高我的可调用云函数的安全性?

Firebase 如何提高我的可调用云函数的安全性?,firebase,firebase-authentication,google-cloud-functions,Firebase,Firebase Authentication,Google Cloud Functions,我想在我的移动应用程序上为我的Firestore数据库创建一个搜索功能,因此我将使用弹性搜索产品(Swiftype),如果我提出更多搜索请求,那么它将更加昂贵(大约10万个请求/10美元,数据将通过restful API传输) 我担心会有一个恶意用户,可以在短时间内发出数千个请求,这会破坏我的账单。因此,为了确保安全并避免恶意用户,我制作了一个类似这样的可调用云功能,因为我还在我的移动应用程序上使用Firebase身份验证 exports.performFullTextSearch = func

我想在我的移动应用程序上为我的Firestore数据库创建一个搜索功能,因此我将使用弹性搜索产品(Swiftype),如果我提出更多搜索请求,那么它将更加昂贵(大约10万个请求/10美元,数据将通过restful API传输)

我担心会有一个恶意用户,可以在短时间内发出数千个请求,这会破坏我的账单。因此,为了确保安全并避免恶意用户,我制作了一个类似这样的可调用云功能,因为我还在我的移动应用程序上使用Firebase身份验证

exports.performFullTextSearch = functions.https.onCall(async (data, context) => {

    if (context.auth) {

        // make request to Elastic Search

    } else {
 
        // perform rejection
    }

})

使用上述代码可以安全地防止恶意用户吗?我可以提高安全性吗?很抱歉,我实际上是一名Android和iOS开发人员。因此我对后端的知识有限

是的,您的代码是正确的,可以避免任何经过身份验证的用户运行弹性搜索。只需使用
return null;
结束云功能,如下所示低点

exports.performFullTextSearch = functions.https.onCall(async (data, context) => {

    if (context.auth) {

        // make request to Elastic Search

    } else {
        return null;
    }

})


完整地说,请注意,未经身份验证的用户将能够调用云函数(导致一次云函数调用),但将无法在
if
块的第一部分运行代码。

如今,没有什么可以说是安全的

如果您确实对请求数量感到紧张,可以通过一种变通方法,您可以对用户在特定时间段内的请求数量施加限制(这对于普通用户

假设在10分钟内只允许5个请求

boolean isLimitExceeded;  
它告诉您是否超出了用户的限制,您必须相应地更新。在您的函数中,您检查是否超出了限制,并相应地给出一个结果:

if(isLimitExceeded){
    //reject
} else {
   //perform the search
} 
显然,这会增加Firebase Firestore数据库的成本,但有些东西需要妥协

您也可以将其存储在本地设备中,但当然,您不能说用户何时清除数据

更新 应实施的最终代码为:

if (context.auth) {

    if(isLimitExceeded){

       // limit is exceeded, reject

    } else {

      //limit not exceeded and the user is authenticated perform the search

    } 

} else {

    // user is not authenticated , perform rejection
}

您好,如果用户未通过身份验证,您将如何识别他/她?除了@sarah给出的代码片段之外,我还回答了这个问题。在检查用户是否通过身份验证后(如代码片段中所示),我的答案可以实现。@sarah我知道你没有接受答案。有什么具体原因吗?如果你需要更多帮助或关于我答案的更多细节,请毫不犹豫地与我联系,这样我们就能找到解决方案。