San*_*rma 2 security authentication angularjs firebase
我最近开始探索firebase作为我的Angular JS单页网站的身份验证解决方案,它看起来很完美。但是,从安全角度来看,我不确定在应用程序中将逻辑保留在客户端上。
假设我为在我的网站上注册并应该填写其个人资料的客户提供一张名为“ isProfileCompleted”的支票。我将数据保留在由UID键控的JSON中,并且仅具有对客户的独占写入权限。
问题是,既然客户端可以对其数据进行写访问,那么他只需在浏览器中修改javascript,就可以轻松地绕过客户端验证检查。此外,客户可以轻松地将其account_type更新为作者/主持人,因为这是他的数据。Firebase是否可以解决此问题?
让我知道是否不清楚,所以我将尝试进一步阐述。
谢谢。
您可以使用“安全规则”保护数据。
Firebase安全规则是Firebase服务器上存在的一种基于表达式(将真值评估为true / false的真值)的规则语言,用于验证当前用户是否可以访问您的数据。
采用以下数据结构:
{
// the users of the app
"users": {
"1": {
"name": "Sanjay",
"isProfileCompleted": true
},
"2": {
"name": "David",
"isProfileCompleted": false
}
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,任何人都可以读取数据或将数据写入Firebase数据库。要解决此问题,您可以编写安全规则。
安全规则本质上是对数据结构的注释:
{
"rules": {
"users": { // /users is read only
".read": true,
".write": false
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过“安全规则”,您可以访问一组服务器变量来检查规则。最常用的auth变量是可让您对照当前已验证用户的变量。您也可以使用来创建通配符变量,该变量$充当创建路由参数的作用。
{
"rules": {
"users": {
// users can read and write their own data, but no one else.
"$uid": {
".read": "auth.uid == $uid",
".write": "auth.uid == $uid"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您甚至可以编写规则来验证数据的结构。
{
"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()"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是Bolt编译器是对此更好的解决方案,因为它允许您创建Types来定义模式。
您可以在Firebase应用仪表板中编写安全规则,也可以通过Firebase CLI上传它们。