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

标签 javascript jquery firebase web-applications firebase-authentication

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

我还没有找到任何允许我“远程”退出 session 的方法。我知道我可以在一个 session 中使用 unauth() 和 goOffline()。但如何从同一用户的不同身份验证 session 中执行此操作?

感谢您的帮助!

背景信息:

  1. 我使用简单的电子邮件/密码登录进行 firebase 身份验证
  2. 我还没有设置安全规则,虽然这是在进行中
  3. 我在 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/

相关文章:

javascript - Laravel、jQuery - 在 Laravel 中验证后返回括号表示法(jQuery 中的点到括号表示法)

javascript - 是否可以在 1 个 Regex 表达式中进行 2 个替换操作?

javascript - 使用带有多个选择器的 jQuery 触发 "change"

javascript - 如何在 onchange 事件上使用 php 、 ajax 上传图像

android - 所有 gms/firebase 库必须使用完全相同的版本(混合版本会导致运行时崩溃)。找到版本 16.1.1 16.0.1 16.0.0 15.0.1

javascript - 如何等到元素的文本在 WebdriverJS 中发生变化?

javascript - 如何在jquery中添加一个或多个克隆

javascript - 使用 jquery 将值从一个输入传递到另一个输入时遇到问题

ios - Firebase 查询是否可扩展

firebase - sendEmailVerification 与 sendSignInLinkToEmail 使用 firebase 进行电子邮件验证