我最近开始探索firebase作为我的角度JS单页网站的身份验证解决方案,它看起来很完美。但是从安全角度来看,我不太确定在我的应用程序中将逻辑保留在客户端。
假设我在我的网站上注册并且应该完成他的个人资料的客户检查'isProfileCompleted'。我将数据保存在由UID键入的JSON中,只对客户进行独占写访问。
问题是,既然客户端具有对其数据的写访问权限,他可以通过简单地在浏览器中修改javascript来轻松绕过客户端验证检查。此外,客户端可以轻松地将其account_type更新为作者/主持人,因为这是他的数据。 firebase是否提供了解决此问题的方法?
如果不清楚,请告诉我,所以我会进一步详细说明。
感谢。
答案 0 :(得分:5)
您可以使用安全规则保护您的数据。
Firebase安全规则是基于Firebase服务器上的规则语言的表达式(执行真正评估为真/假)并验证当前用户是否可以访问您的数据。
采用以下数据结构:
{
// the users of the app
"users": {
"1": {
"name": "Sanjay",
"isProfileCompleted": true
},
"2": {
"name": "David",
"isProfileCompleted": false
}
}
}
默认情况下,任何人都可以读取或写入Firebase数据库的数据。要解决此问题,您可以编写安全规则。
安全规则本质上是对数据结构的注释:
{
"rules": {
"users": { // /users is read only
".read": true,
".write": false
}
}
}
安全规则允许您访问一组服务器变量以检查您的规则。最常用的是auth
变量,它允许您检查当前已验证的用户。您还可以使用$
创建通配符变量,该变量用作创建路径参数。
{
"rules": {
"users": {
// users can read and write their own data, but no one else.
"$uid": {
".read": "auth.uid == $uid",
".write": "auth.uid == $uid"
}
}
}
}
您甚至可以编写规则来验证数据结构。
{
"rules": {
"users": {
// users can read and write their own data, but no one else.
"$uid": {
".read": "auth.uid == $uid",
".write": "auth.uid == $uid",
".validate": "newData.hasChildren(['name', 'isProfileCompleted']),
"name": {
".validate": "newData.isString()"
},
"isProfileCompleted": {
".validate": "newData.isBoolean()"
}
}
}
}
}
但是Bolt compiler is a better solution for this,因为它允许你创建类型来定义模式。
您可以在Firebase应用控制台中编写安全规则,也可以通过Firebase CLI上传。