在通过 Firebase 身份验证创建用户后,将用户名传递到后端的这两者之间哪种方法更安全?

Posted

技术标签:

【中文标题】在通过 Firebase 身份验证创建用户后,将用户名传递到后端的这两者之间哪种方法更安全?【英文标题】:Which is the more secure method between these two for passing the username to the backend after creating the user via Firebase auth? 【发布时间】:2021-08-19 04:38:51 【问题描述】:

使用auth.createUserWithEmailAndPassword创建用户后,我需要在Cloud Firestore中创建相关文档。

选项 1:如果auth.createUserWithEmailAndPassword 任务成功,则从应用程序调用云函数并将用户名、UID 和电子邮件传递给它以创建相关文档。

if (user.isNotEmpty() && email.isNotEmpty() && password.isNotEmpty()) 
                fs.authCreateUser(email, password)
                    .addOnCompleteListener()  task ->
                        if (task.isSuccessful) 
                            Log.e(tag, "createUserWithEmailAndPassword task was successful")

                            fs.CFcreateUser(user, email)
                                .addOnCompleteListener()  task ->
                                    if (task.isSuccessful) 
                                        Log.e(tag, "CFcreateUser task was successful")

                                        val result = task.result!!["result"]
                                        val message = task.result!!["message"]

                                        //If result = 1, go to Groups Activity
                                        //Else, delete the Firebase user so that the list of authenticated users matches the list of users in Firestore
                                        if (result == "1") 
                                            val intent = Intent(this, ActivityGroups::class.java)
                                            startActivity(intent)
                                            finish()
                                         else 

                                        
                                     else 
                                        Log.e(tag, "CFcreateUser task failed")
                                        Log.e(tag, "CFcreateUser task: $task.exception.toString()")
                                    
                                

                         else 
                            Log.e(tag, "createUserWithEmailAndPassword task failed")
                            Log.e(tag, "createUserWithEmailAndPassword exception: $task.exception.toString()")
                        
                    
            

选项 2:如果 auth.createUserWithEmailAndPassword 任务成功,则使用 user!!.updateProfile (from the docs) 更新用户的 displayName,然后以某种方式设置后台触发器以使用 displayname 作为用户名创建相关文档。

//After the auth.createUserWithEmailAndPassword task runs, run the code below 
val user = Firebase.auth.currentUser

val profileUpdates = userProfileChangeRequest 
    displayName = "Jane Q. User"
    photoUri = Uri.parse("https://example.com/jane-q-user/profile.jpg")


user!!.updateProfile(profileUpdates)
        .addOnCompleteListener  task ->
            if (task.isSuccessful) 
                Log.d(TAG, "User profile updated.")
            
        

不确定哪个选项更安全,我是 android 开发新手。

【问题讨论】:

【参考方案1】:

这两种方法哪个更安全?

向 Firebase 产品(如 Cloud Firestore、Firebase Realtime Database 或 Cloud Functions for Firebase)发出并且来自后端 SDK 的所有请求都将完全绕过安全规则。还要提一下,这还包括Firebase Admin SDK。安全规则适用于网络和移动客户端。另一方面,在使用客户端代码时,您可以使用Cloud Firestore Security Rules 或Firebase Realtime Database Security Rules 来保护您的应用。

话虽如此,在我看来,这与安全性无关,而是与效率有关。确实可以让客户端应用程序完成这项工作,但有一个缺点,因为您可以使用 Cloud Functions 更有效地完成这项工作。如果客户端应用程序可以完成这项工作,那么就数据使用和速度而言,您不必为数据计划支付费用。对于 Cloud Functions,一切都在内部完成。

因为您使用的是 Firebase 身份验证,所以您可以创建一个 Cloud Function 来简单地解决这个问题。所以你必须创建一个每次发生新事情时都会触发的函数。这里我说的是trigger of a function on user creation。

Cloud Storage triggers 也是如此。

【讨论】:

嗨!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑采纳(✔️)。我真的很感激。谢谢!

以上是关于在通过 Firebase 身份验证创建用户后,将用户名传递到后端的这两者之间哪种方法更安全?的主要内容,如果未能解决你的问题,请参考以下文章

来自已经过身份验证的帐户的Firebase createUserWithEmailAndPassword()

如何在通过 Redux 操作进行身份验证后重定向用户?

如何在不关闭当前 Firebase 会话的情况下创建用户身份验证 [重复]

React JS Twitter身份验证Firebase

通过 OpenID Connect 进行 Firebase 身份验证

Firebase:用户注册后如何进行电话号码验证?