XMPP 带内注册(XEP-0077):与简单的 jid/pw 登录不同,都有哪些步骤?

Posted

技术标签:

【中文标题】XMPP 带内注册(XEP-0077):与简单的 jid/pw 登录不同,都有哪些步骤?【英文标题】:XMPP in-band registration (XEP-0077): Differs from simple jid/pw login, what are the steps?XMPP 带内注册(XEP-0077):与简单的 jid/pw 登录不同,有哪些步骤? 【发布时间】:2014-09-11 23:47:37 【问题描述】:

所以我有一个小的 javascript/Strophejs xmpp 客户端,它连接到 ejabberd 服务器。到目前为止,我已经在 ejabberd 网络管理员中创建了用户,例如我创建了用户 a@testserver.p1.im 和用户 b@testserver.p1.im。

我的客户支持登录这些现有帐户之一,并在这些帐户/用户之间发送消息。

不过,我还希望能够从 html 表单在服务器上创建用户,用户可以在其中输入所需的 jid 和密码。

在 xmpp 中,这称为带内注册 (http://xmpp.org/extensions/xep-0077.html)。

现在,这是用户登录现有帐户时的基本场景:

$(document).ready(function () 
$('#SignIn').bind('click', function () 
    $(document).trigger('connect',  
                                    jid: $('#LogineMail').val(), password: $('#LoginPassword_f').val()
                                    
                        );
                        );
);

所以,上面的代码触发了“连接”,如下所示:

$(document).bind('connect', function (ev, data) 
console.log('connect fired');
var conn = new Strophe.Connection("http://bosh.metajack.im:5280/xmpp-httpbind");
conn.connect(data.jid, data.password, function (status) 
    console.log('callback being done');
    if (status === Strophe.Status.CONNECTED) 
        alert('connected!');
        $(document).trigger('connected');
        alert('Connected successfully');
     else if (status === Strophe.Status.DISCONNECTED) 
        $(document).trigger('disconnected');
    
    else
    
        Hello.log("error");
        console.log('error');
    
);

Hello.connection = conn;
);

即,这会创建一个新的 Strophe.connection,并使用给定的 jid 和密码登录。然后我可以发送消息。

但是,带内注册的情况有点不同。 XEP-0077 指出:

3.1 实体向主机注册

为了确定向主机注册需要哪些字段,实体应首先向主机发送 IQ get。实体不应尝试通过首先发送 IQ 集来猜测所需字段,因为所需数据的性质取决于服务供应。

示例 1. 实体向主机请求注册字段

<iq type='get' id='reg1' to='shakespeare.lit'>
  <query xmlns='jabber:iq:register'/>
</iq>

这意味着,在我以用户身份登录到服务器之前,我需要能够发送 IQ 请求并接收响应,因为显然,如果我是在服务器上请求帐户的用户,我可能还没有服务器上的帐户,因此无法使用 jid/密码组合登录。

如何解决这个问题?关于入站注册的连接和节发送的通常步骤是什么?例如,我是否应该在服务器上有某种管理员帐户,然后在想要添加新用户时从代码登录,并使用此管理员帐户获取带内注册所需的要求/字段并注册新的用户?或者好的/标准方法是什么?

谢谢和最好的问候,

克里斯

编辑:我刚刚找到了我正在尝试使用的 strophe.register.js 插件。但是我在 strophe.register.js 代码中遇到错误,而不是在我自己的代码中。

这是我的注册代码:

$('#JoinSend').bind('click', function () 
    var tempConn = new Strophe.Connection("http://bosh.metajack.im:5280/xmpp-httpbind");
    tempConn.register.connect("testserver.host56.com", function (status) 
        if (status === Strophe.Status.REGISTER) 
            // fill out the fields
            connection.register.fields.username = "juliet";
            connection.register.fields.password = "R0m30";
            // calling submit will continue the registration process
            connection.register.submit();
         else if (status === Strophe.Status.REGISTERED) 
            console.log("registered!");
            // calling login will authenticate the registered JID.
            connection.authenticate();
         else if (status === Strophe.Status.CONFLICT) 
            console.log("Contact already existed!");
         else if (status === Strophe.Status.NOTACCEPTABLE) 
            console.log("Registration form not properly filled out.")
         else if (status === Strophe.Status.REGIFAIL) 
            console.log("The Server does not support In-Band Registration")
         else if (status === Strophe.Status.CONNECTED) 
            // do something after successful authentication
         else 
            // Do other stuff
        
    );
    );

我在 chrome JS 控制台中收到以下错误:

未捕获的类型错误:无法读取未定义的属性“绑定”:strophe.register.js:90。

不确定我是否遗漏了什么,或者 strophe.register.js 是否有其他依赖项?

我在这里使用 strophe.register.js:https://github.com/strophe/strophejs-plugins/blob/master/register/strophe.register.js

【问题讨论】:

【参考方案1】:

“连接”到服务器和“认证”连接是有区别的。为了执行带内注册,您只需要连接,不执行验证步骤,然后简单地发送节来执行注册。如果服务器支持带内注册,他将允许这样做(但他应该在连接未经过身份验证时阻止与其他 XMPP 实体的任何通信)。

【讨论】:

您好,谢谢您的回答。我找到了 strophe.register.js,现在正在尝试使用它。据我了解,它应该允许我相当容易地注册用户,但是,我遇到了一些问题。我已将此添加到原始帖子中。谢谢,兄弟,克里斯 我不确定,但我认为您应该考虑在一个新问题中提出您现在更具体的问题,并将此问题标记为已回答。现在,您的问题帖子是一堵巨大的文字墙,实际问题被很好地隐藏了。 是的,我会这样做的。我只是有时会犹豫是否要提出太多问题,不确定 SO 是否喜欢这样。但在这种情况下我会这样做,感谢您的意见! 重要的是问题的“质量”,而不是数量。

以上是关于XMPP 带内注册(XEP-0077):与简单的 jid/pw 登录不同,都有哪些步骤?的主要内容,如果未能解决你的问题,请参考以下文章

Ejabberd 限制用户注册权限

XMPP ejabberd 带内注册:接收 xml BOSH 未启动,即使它是

带内账户注册后怎么办

SMACK API 带内注册失败并出现禁止错误

通过 Bosh 进行的 Openfire 带内注册无法与 Strophe/Strophe.register.js 一起使用

6. Swift 基于Xmpp和openfire实现一个简单的登录注册