我希望新 session 基本上“注销”任何先前的 session 。例如,当您在一台计算机上进行经过身份验证的 session 时,在另一台计算机上启动一个新 session 并在我们的应用程序上使用 firebase 进行身份验证将注销第一台计算机上的另一个 session 。
我还没有找到任何允许我“远程”退出 session 的方法。我知道我可以在一个 session 中使用 unauth() 和 goOffline()。但如何从同一用户的不同身份验证 session 中执行此操作?
感谢您的帮助!
背景信息:
- 我使用简单的电子邮件/密码登录进行 firebase 身份验证
- 我还没有设置安全规则,虽然这是在进行中
- 我在 Firebase 中使用 Javascript
最佳答案
一般的想法是,您想在 Firebase 中创建一些元数据,告诉您用户从多少个位置登录。然后您可以使用此信息限制他们的访问。
为此,您需要生成自己的 token (以便您的安全规则可以使用该信息)。
1) 生成 token
使用custom login生成您自己的 token 。每个 token 都应包含客户端的唯一 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)使用presence存储用户的location_id
查看 managing presence详情入门:
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()(或获得付费计划,这样您就没有连接的硬性上限)。
关于javascript - 如何防止同一用户使用 Firebase 同时登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21321234/