且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何防止同一用户同时登录Firebase?

更新时间: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_pa​​th:{
.read:root.child('logged_in_users /'+ auth.id).val()=== auth.location_id
}




$ b $ p 控制对logged_in_users的写访问

您需要设置一些控制对logged_in_users的写入权限的系统。显然用户只能写自己的记录。如果您希望第一次登录尝试总是胜出,那么通过使用write:!data.exists()来防止写入(如果存在值)然而,你可以通过允许上次登录获胜而大大简化,在这种情况下,它会覆盖旧的位置值,并且以前的登录将失效并失败阅读。