在 XMPP 和 django 之间同步用户

Posted

技术标签:

【中文标题】在 XMPP 和 django 之间同步用户【英文标题】:Synchronize users between XMPP and django 【发布时间】:2012-11-26 03:00:21 【问题描述】:

我正在创建一个使用 django 作为后端的 ios 应用程序。我需要用户之间的聊天功能。

听说 XMPP 对实时通信有好处,我已经成功将 ejabberd 设置为 XMPP 服务器。但是我仍然很难处理细节: 我先创建了应用程序,然后创建了聊天功能,所以在我设置 ejabberd 之前,我的 django DB 中已经有用户了。我需要 ejabberd 针对我现有的数据库对用户进行身份验证,我几乎通过使用外部身份验证解决了这个问题。只有一个小问题,因为 ejabberd 似乎需要像 username@abc.com 这样的 jabber ID,而这里 abc 表示 ejabberd 的虚拟主机。我不知道也许我只能在我的服务器上使用一个虚拟主机(即域名)?但是一开始我要求用户使用来自不同域的电子邮件进行注册,例如gmail.com,yahoo.com,但 username@gmail.com@abc.com 不是有效的 jabber ID,所以我可以在这里做的一个小技巧是先将 @ 转换为 # 并处理它在后端的python脚本中正确。但也许我做错了?

另一个问题是关于用户个人资料。我也将用户信息存储在我的 django DB 中,例如显示名称、头像 url 等。我了解到,如果我想从 XMPP 服务器获取这些信息,我可以使用 vCard 模块。所以也许我需要在两个地方有重复的信息?而且我还没有弄清楚如何将用户信息从 DB 同步到 ejabberd。或者也许我只需要一个来源,即我的数据库,然后 iOS 客户端可以在需要时从后端查询信息?

我觉得 XMPP 不容易设置,在你的应用程序中使用它真的很受欢迎吗?特别是如果聊天不是您应用的主要功能,并且您不希望收到来自大量用户的大量消息?

【问题讨论】:

【参考方案1】:

你写道:

但 username@gmail.com@abc.com 不是有效的 jabber ID

您应该转义用户 ID(即“username@gmail”)。

XEP 106 解释了如何转义 JID 的节点部分。

在 python 中,它看起来像这样:

def escape_node(node):
    """ """
    node.strip()
    node = node.replace('\\', "\\5c")
    node = node.replace(' ',  "\\20")
    node = node.replace('\"', "\\22")
    node = node.replace('\&', "\\26")
    node = node.replace('\'', "\\27")
    node = node.replace('\/', "\\2f")
    node = node.replace(':',  "\\3a")
    node = node.replace('<',  "\\3c")
    node = node.replace('>',  "\\3e")
    node = node.replace('@',  "\\40")
    return node

关于在 Django 中存储用户的详细信息。当您在 XMPP 中注册 Django 用户时,只需确保您还为他们注册了有效的 vCard。

当 Django 用户更改他的详细信息时,也要更新 vCard。

【讨论】:

感谢它非常有帮助。看来我只需要在 vCard 中存储照片 url 而不是实际数据,因为它更节省空间并且 iOS 客户端不必再次下载它(因为头像在其他地方使用,但 XMPPFramework 扩展不支持这还)。您能否指出一些链接,这些链接描述了如何“使用 python 从 django 更新 vCard(特别是 ejabberd)”,是否有任何关于如何编写 python 代码以与 ejabberd 通信的教程(我假设使用 ejabberdctl 不是正确的方式)? 我使用 Twisted 和 Wokkel 从 Python 与 XMPP 服务器进行通信。 wokkel.ik.nu。您也可以使用这些库创建带有 vCard 的 IQ 节。 我可以通过 twisted 和 wokkel 同步姓名和照片,但我只能在独立的应用程序中进行。当我将它与 django 放在一起时,似乎 reactor.run() 会阻塞,在单独的线程中运行它并没有帮助,因为 reactor.run() 只会在主线程中运行......如果我停止反应器并需要时再次运行它,然后我收到 ReactorNotRestartable 错误...您能否提供有关如何执行此操作的更多详细信息?谢谢。

以上是关于在 XMPP 和 django 之间同步用户的主要内容,如果未能解决你的问题,请参考以下文章

如何集成 Django 和 XMPP-over-BOSH

一旦我可以使用 XMPP 列出用户,我如何在这些用户之间实现聊天?

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

使用开源 xmpp 库连接到 nimbuzz 聊天

如何将 django rest api 中的用户与 Auth0 同步

在 XMPP 中注册无密码用户