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

我希望新会议基本上“退出”任何以前的会话。 例如,当您在一台计算机上进行经过身份validation的会话时,在另一台计算机上启动新会话并在我们的应用程序上使用firebase进行身份validation将在第一台计算机上注销另一个会话。

我无法找到任何允许我“远程”退出会话的方法。 我知道我可以在会话中使用unauth()和goOffline()。 但是,如何从同一用户的其他经过身份validation的会话中执行此操作?

谢谢您的帮助!

背景资料:

  1. 我使用简单的电子邮件/密码登录进行firebase身份validation
  2. 我还没有设置安全规则,虽然这是在开发中
  3. 我在Firebase中使用Javascript

一般的想法是,您希望在Firebase中创建一些元数据,告诉您用户登录的位置数。 然后,您可以使用此信息限制其访问权限。

为此,您需要生成自己的令牌(以便您的安全规则可以使用这些信息)。

1)生成令牌

使用自定义登录生成您自己的令牌。 每个令牌应包含客户端的唯一ID(IP地址?UUID?)

var FirebaseTokenGenerator = require("firebase-token-generator"); var tokenGenerator = new FirebaseTokenGenerator(YOUR_FIREBASE_SECRET); var token = tokenGenerator.createToken({ id: USER_ID, location_id: IP_ADDRESS }); 

2)使用在线存储用户的location_id

查看管理在线入门详情:

 var fb = new Firebase(URL); // after getting auth token back from your server var parts = deconstructJWT(token); var ref = fb.child('logged_in_users/'+token.id); // store the user's location id ref.set(token.location_id); // remove location id when user logs out ref.onDisconnect().remove(); // Helper function to extract claims from a JWT. Does *not* verify the // validity of the token. // 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)))); } return token; } 

3)添加安全规则

在安全规则中,强制只有当前唯一位置才能读取数据

 { "some_restricted_path": { ".read": "root.child('logged_in_users/'+auth.id).val() === auth.location_id" } } 

4)控制对logged_in_users的写访问

您需要设置一些控制对logged_in_users的写访问权限的系统。 显然,用户应该只能写入自己的记录。 如果您希望第一次登录尝试始终获胜,则使用".write": "!data.exists()"阻止写入(如果它们存在)( ".write": "!data.exists()"

但是,您可以通过允许上次登录获胜来大大简化,在这种情况下,它会覆盖旧的位置值,之前的登录将无效并且无法读取。

5)这不是控制并联数量的解决方案

您不能使用此function来防止Firebase出现多个并发现象。 请参阅goOffline()和goOnline()以获取有关完成此操作的更多数据(或获取付费计划,以便您在连接上没有硬性限制)。