android - 在通过 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 开发新手。
解决方案
这两者之间哪种方法更安全?
向Cloud Firestore、Firebase Realtime Database或Cloud Functions for Firebase等Firebase 产品发出的所有来自后端 SDK 的请求都将完全绕过安全规则。还要提一下,这还包括Firebase Admin SDK。安全规则仅适用于 Web 和移动客户端。另一方面,在使用客户端代码时,您可以使用Cloud Firestore 安全规则或Firebase 实时数据库安全规则来保护您的应用。
话虽如此,在我看来,这与安全性无关,而是与效率有关。确实可以让客户端应用程序完成这项工作,但有一个缺点,因为您可以使用 Cloud Functions 更有效地完成这项工作。如果客户端应用程序能够完成这项工作,那么就数据使用和速度而言,您不必为数据计划支付费用。对于 Cloud Functions,一切都在内部完成。
因为您使用的是 Firebase 身份验证,所以您可以创建一个 Cloud Function 来简单地解决这个问题。所以你必须创建一个每次发生新事情时都会触发的函数。这里我说的是用户创建功能的触发器。
当我们谈论云存储触发器时也是如此。
推荐阅读
- c# - C# 在多维数组列表的列中定位重复项
- node.js - 视频 url 在节点 js 中使用 tiktok-package 显示为空
- python - 具有 300 多列的空 pandas 数据框
- python - 如何在 SQLAlchemy for PostgreSQL 中编写没有子查询的 UPDATE FROM
- python - 为什么 df.select(dayofyear(df['Date']))['dayofyear(Date)'] 但 withColumn('Days', dayofyear(df['Date'])) 出现异常?
- json - 从 search:extracted 中提取每个 json 属性值
- c# - 比较 2 个列表数据与部分匹配并从两个列表返回聚合数据
- linux - 如何隔离进程?寻找 slurm 的单节点替代方案
- php - PhpStorm 2020.1 对 Chrome Xdebug 扩展没有反应
- kotlin - Kotlin:以功能方式组合列表中的所有元素