在 XMPP 中检测使用相同帐户的其他客户端

Posted

技术标签:

【中文标题】在 XMPP 中检测使用相同帐户的其他客户端【英文标题】:Detecting other clients using the same account in XMPP 【发布时间】:2011-09-01 15:16:59 【问题描述】:

XMPP 允许用户使用同一个帐户同时从多个客户端连接到服务器。我构建了一个执行此操作的应用程序,但如果启用了桌面客户端,我不希望用户能够使用移动客户端进行连接。这是一个游戏,连接到两者都会导致问题。

所以我想知道的是: 是否可以检测是否有其他客户端使用同一帐户连接。如果我可以检查其他客户端,我可以自动注销用户。

【问题讨论】:

【参考方案1】:

@Flow 是在正确的轨道上。如果您的所有客户端实例都使用相同的资源,那么在大多数服务器中,稍后连接的客户端将替换旧会话。较旧的会话将收到conflict 流错误,并被断开连接。您必须注意不要与旧客户端自动重新连接,否则您将编写“资源决斗”错误。

如果您可以控制您的服务器,您就有机会将其配置为允许给定用户最多使用一个资源,在这种情况下,较新的连接会因冲突错误而失败,但您的用户会更差如果你沿着这条路走,界面问题;即使您愿意,也无法让第二个客户端登录。

最后,给定用户的所有资源都订阅了该用户的状态。只要您的客户发送出席信息:

<presence/>

您将收到来自其他每台设备的在线信息:

<presence to='user@example.com/resource1' from='user@example.com/resource2'/>
<presence to='user@example.com/resource1' from='user@example.com/resource3'/>
<presence to='user@example.com/resource1' from='user@example.com/resource4'/>

您可以使用它来决定哪个客户端是当前的,也许可以通过向存在添加扩展名,例如 XEP-0115。

【讨论】:

【参考方案2】:

给桌面和移动客户端一个固定但不同resource string。如果移动客户端登录,它可以通过查找桌面客户端资源的存在/可用性来检测桌面客户端的存在,反之亦然。

那么你只需要实现一个自定义的XMPP ad-hoc command (XEP-0050),告诉冲突的资源退出。

【讨论】:

【参考方案3】:

这将是服务器的责任:拒绝来自不被接受的客户端的登录。我不知道服务器是否能够将 xmpp 客户端列入黑名单,但如果你使用 openfire,你应该能够编写扩展。

【讨论】:

很遗憾,我无法控制服务器。没有命令可以发送到服务器以获取使用“我的”用户名登录的客户端列表? 我看到的唯一机会是,当您的游戏服务器(?)收到来自用户的消息时,完整的 jabber id 可能会告诉您客户端,因此游戏服务器可能会阻止该用户。 ..虽然听起来不是最理想的...

以上是关于在 XMPP 中检测使用相同帐户的其他客户端的主要内容,如果未能解决你的问题,请参考以下文章

我如何从客户端知道一个帐户是不是存在于 XMPP 服务器中?

在不开始聊天的情况下发送 XMPP 消息

XMPP 与 Strophe 的客户端之间的 IQ 交换

如何在 XMPP/Jabber 中重新连接匿名用户

创建 php 表单以允许创建新的 XMPP 帐户 [关闭]

使用 Strophe.js 名册插件和 Ejabberd 接收“订阅”状态