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

 烦恼的天伦之乐_456 发布于 2023-01-31 17:34

我希望新会议基本上"退出"任何以前的会话.例如,当您在一台计算机上进行经过身份验证的会话时,在另一台计算机上启动新会话并在我们的应用程序上使用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()以获取有关完成此操作的更多数据(或获取付费计划,以便您无需连接上限).

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有