更新时间:2023-10-28 09:55:22
一般的想法是,您想在Firebase中创建一些元数据,告诉您用户登录的位置。然后,您可以使用这些信息来限制他们的访问。
为此,您需要生成自己的令牌(以便您的安全规则可以使用这些信息) 。
$ b $ p 生成一个令牌
使用自定义登录来生成自己的令牌。每个标记应该包含一个唯一的客户端ID(IP地址?UUID?)
$ p $ var $ FirebaseTokenGenerator = require(firebase-token -发电机);
var tokenGenerator =新的FirebaseTokenGenerator(YOUR_FIREBASE_SECRET);
var token = tokenGenerator.createToken({id:USER_ID,location_id:IP_ADDRESS});
2)使用状态存储用户的location_id
查看管理状态入门详情:
var fb =新的Firebase(网址);
//从服务器获取授权令牌之后
var parts = deconstructJWT(token);
var ref = fb.child('logged_in_users /'+ token.id);
//存储用户的位置id
ref.set(token.location_id);
//当用户注销时删除位置ID
ref.onDisconnect()。remove();
//辅助函数从JWT中提取声明。 *不*验证令牌的
//有效性。
// credits:https://github.com/firebase/angularFire/blob/e8c1d33f34ee5461c0bcd01fc316bcf0649deec6/angularfire.js
function deconstructJWT(token){
var segments = token.split(。 );
if(!segments instanceof Array || segments.length!== 3){
throw new Error(Invalid JWT);
}
var claims = segments [1];
if(window.atob){
return JSON.parse(decodeURIComponent(escape(window.atob(claims))));
}
返回令牌;
$ b 3)添加安全规则
在安全规则中,强制只有当前的唯一位置可以读取数据。
{
some_restricted_path:{
.read:root.child('logged_in_users /'+ auth.id).val()=== auth.location_id
}
$ b $ p 控制对logged_in_users的写访问
您需要设置一些控制对logged_in_users的写入权限的系统。显然用户只能写自己的记录。如果您希望第一次登录尝试总是胜出,那么通过使用write:!data.exists()来防止写入(如果存在值)然而,你可以通过允许上次登录获胜而大大简化,在这种情况下,它会覆盖旧的位置值,并且以前的登录将失效并失败阅读。