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

问题描述

使用 创建用户后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更新用户的 displayName,然后以某种方式设置后台触发器以使用 displayname 作为用户名创建相关文档。user!!.updateProfile

//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 开发新手。

标签: androidfirebasekotlingoogle-cloud-firestoregoogle-cloud-functions

解决方案


这两者之间哪种方法更安全?

向Cloud FirestoreFirebase Realtime DatabaseCloud Functions for Firebase等Firebase 产品发出的所有来自后端 SDK 的请求都将完全绕过安全规则。还要提一下,这还包括Firebase Admin SDK。安全规则适用于 Web 和移动客户端。另一方面,在使用客户端代码时,您可以使用Cloud Firestore 安全规则Firebase 实时数据库安全规则来保护您的应用。

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

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

当我们谈论云存储触发器时也是如此。


推荐阅读