我有一个正在Kotlin中构建的应用程序,后端是Node.js。我允许用户使用客户端应用程序上的Firebase身份验证登录/注册。
该应用程序功能的一部分是让用户通过Firebase的实时数据库在线保存数据。在应用程序内部发生的情况是,一旦用户登录,我就将其uid传递给后端,后端向数据库发出请求。
当数据库规则允许所有人读写时,一切工作都很好。一旦我将它们更改为此:
{
"rules": {
"users": {
".read": "auth != null && auth.uid != null",
".write": "auth != null && auth.uid != null",
}
}
}
我一直在被拒绝权限。
我尝试了规则的不同变体:
但似乎没有任何作用。
我缺少一些步骤吗?
我已经梳理了许多类似的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()
}
})
}
}
经过一番搜索,我找到了解决问题的方法。
看来,因为我正在对客户端上的用户进行身份验证,并且后端与Firebase的实时数据库进行通信,所以必须在后端使用Firebase的Admin SDK。
这是因为需要传递每次用户登录并在客户端中进行身份验证时生成的唯一令牌。然后需要将该令牌发送到后端,并在尝试访问实时数据库时使用。
对于任何会偶然发现此问题并想知道如何解决的人,请访问以下链接:
另外,请确保正确引用您的数据库名称
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句