【发布时间】:2020-12-29 06:55:48
【问题描述】:
我有一个使用 Kotlin 构建的应用程序,后端使用 Node.js。 我允许用户在客户端应用程序上使用 Firebase 身份验证登录/注册。
该应用程序的部分功能是让用户通过 Firebase 的实时数据库在线保存数据。应用程序内部发生的情况是,一旦用户登录,我将他/她的 uid 传递给后端,后端向数据库发出请求。
当数据库的规则是允许所有人读/写时,一切正常。 一旦我将它们更改为:
{
"rules": {
"users": {
".read": "auth != null && auth.uid != null",
".write": "auth != null && auth.uid != null",
}
}
}
我不断收到 Permission Denied。
我尝试了不同的规则变体:
- 没有用户密钥
- 仅检查 auth 是否为空
但似乎没有一个工作。
我是否缺少某些步骤?
我已经梳理了许多类似的 StackOverflow 问题和 Firebase 的实时数据库文档,但没有找到我的问题的答案。
一些代码供参考:
后端:
app.get('/someRoute', function (req, res) {
var database = firebase.database()
var uid = req.query.uid
database.ref('/users/' + uid).once('value')
.then(function(snapshot) {
var data = snapshot.val() ? snapshot.val() : []
res.status(200).send({ response: data})
}).catch(function(error) {
console.log(error)
res.status(500).json({ error: error})
})
})
客户:
fun loginUser(view : View) {
FirebaseAuth.getInstance().signInWithEmailAndPassword(userEmail, userPassword)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
updateFirebaseUserDisplayName()
} else {
Toast.makeText(this, "An error has occurred during login. Please try again later.", Toast.LENGTH_SHORT).show()
}
}
}
fun updateFirebaseUserDisplayName() {
FirebaseAuth.getInstance().currentUser?.apply {
val profileUpdates : UserProfileChangeRequest = UserProfileChangeRequest.Builder().setDisplayName(userEmail).build()
updateProfile(profileUpdates)?.addOnCompleteListener(OnCompleteListener {
when(it.isSuccessful) {
true -> apply {
Intent(this@LoginActivity, MainActivity::class.java).apply {
startActivity(this)
finish()
}
}
false -> Toast.makeText(this@LoginActivity, "Login has failed", Toast.LENGTH_SHORT).show()
}
})
}
}
【问题讨论】:
标签: node.js kotlin firebase-realtime-database firebase-authentication