在Ejabberd/XMPP中同时禁用来自多个设备的用户登录



环境:

埃贾伯德版本 : 16.04

啪啪��

我正在开发一个安卓聊天应用程序。目前,可以从多个设备登录使用相同的用户凭据。

当前方案如下:

1. User logs in into the app in device A
2. Using the same username and password, the user logs successfully into the app in device B
3. Now device A says, it is disconnected, but continue the chat in device B

但是,根据给定的要求,它的行为应该是这样的:

1. User logs in into the app in device A
2. Using the same username and password, when the user tries to log in from device B, it should not allow it. 
(Since he is already logged in from device A)

很高兴听到您对此的解决方案/想法。提前谢谢。

所以我设法使用选项解决了问题resource_conflict

根据 Ejabberd 配置文档

选项resource_conflict定义客户端尝试时的操作 以登录到具有已连接资源的帐户。这 选项语法为:

resource_conflict:setresource|closenew|closeold:可能的值 完全匹配 XMPP 核心:部分中描述的三种可能性 7.7.2.2. 默认值为 closeold。如果客户端使用旧的 Jabber 非 SASL 身份验证 (XEP-0078(,则不考虑此选项, 并且执行的操作是关闭的。

因此,请打开ejabberd.yml并将以下行添加到该文件中。

resource_conflict: closenew 

然后重新启动 ejabberd 服务器。

现在,它将禁止新连接的客户端的资源绑定尝试,并维护当前连接的客户端的会话。

引用:

  1. https://www.rfc-editor.org/rfc/rfc6120#section-7.7.2.2
  2. 阅读@rubycon对此的回答——https://stackoverflow.com/a/51860779/5361779

来自 XMPP 规范:

"如果已经存在同名的活动资源,服务器必须 (1( 终止活动资源并允许新请求的会话,或 (2( 禁止新请求的会话并维护活动资源。服务器执行哪些操作取决于实现,尽管建议实现案例#1。

更多信息在这里 https://xmpp.org/rfcs/rfc3921.html#session

因此,您当前的方案是推荐的方案。

但是,我已经快速检查了 ejabberd src 代码,发现它可以以某种方式配置(closeold -> closenew(

https://github.com/processone/ejabberd/blob/master/src/ejabberd_c2s.erl#L964

https://github.com/processone/ejabberd/blob/master/src/ejabberd_c2s.erl#L873

我不是 Erlang 专家,但看起来可以通过修改源代码来实现

如果设备B 将资源设置为与设备 A 不同的资源,则两者都可以正确连接到同一帐户。在测试中,设备 B 设置的资源与设备 A 完全相同,然后 ejabberd 踢旧会话。

我看到有一个选项可以限制帐户在服务器中可以处于活动状态的会话数。问题是它会踢旧会话,但您想禁止新登录。看 https://docs.ejabberd.im/admin/configuration/#limiting-opened-sessions-with-acl

最新更新