我希望新会议基本上"退出"任何以前的会话.例如,当您在一台计算机上进行经过身份验证的会话时,在另一台计算机上启动新会话并在我们的应用程序上使用firebase进行身份验证将在第一台计算机上注销另一个会话.
我无法找到任何允许我"远程"退出会话的方法.我知道我可以在会话中使用unauth()和goOffline().但是,如何从同一用户的其他经过身份验证的会话中执行此操作?
谢谢您的帮助!
背景资料:
我使用简单的电子邮件/密码登录进行firebase身份验证
我还没有设置安全规则,虽然这是在开发中
我在Firebase中使用Javascript
Kato.. 10
一般的想法是,您希望在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()"
但是,您可以通过允许上次登录获胜来大大简化,在这种情况下,它会覆盖旧的位置值,之前的登录将无效并且无法读取.
5)这不是控制同步数量的解决方案
您无法使用此功能来防止Firebase出现多个并发现象.请参阅goOffline()和goOnline()以获取有关完成此操作的更多数据(或获取付费计划,以便您无需连接上限).