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 登录不同,都有哪些步骤?的主要内容,如果未能解决你的问题,请参考以下文章
XMPP ejabberd 带内注册:接收 xml BOSH 未启动,即使它是
通过 Bosh 进行的 Openfire 带内注册无法与 Strophe/Strophe.register.js 一起使用