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

XMPP in-band registration (XEP-0077): Differs from simple jid/pw login, what are the steps?

本文关键字:登录 pw jid 注册 XEP-0077 简单 XMPP      更新时间:2023-09-26

所以我有一个小的JavaScript/Strophejs-xmpp客户端,它连接到ejabberd服务器。到目前为止,我已经在ejabberd web管理员中创建了用户,例如,我创建了用户a@testserver.p1.im和用户b@testserverp.1.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/密码组合登录。

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

感谢并致以最良好的问候,

Chris

编辑:我刚刚找到了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的属性"bind"。

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

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

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