XMPP带内注册(XEP-0077):与简单的jid/pw登录不同,有哪些步骤
XMPP in-band registration (XEP-0077): Differs from simple jid/pw login, what are the steps?
所以我有一个小的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实体的任何通信)。
- 使用acess代币登录Facebook,并通过网络应用程序离线发布
- 尝试使用Phonegap进行php登录
- Facebook登录按钮没有'不能在Firefox上工作
- 使用javascript反复检查用户在facebook上的登录状态
- Firebase-登录时获取url
- BrowserId登录请求在文档加载时被调用
- 通过iframe登录到远程站点
- Jquery Modal表单登录与AJAX-ASP经典上的IE 9
- 如何使用js自动登录
- 我尝试在登录脚本中使用ajax,但页面不会重定向
- 如何仅在首次登录时显示弹出窗口
- 如何检查用户已经登录facebook
- Facebook登录不适用于iOS的应用内浏览器
- Facebook登录按钮悬停框
- Phonegap:获取访问令牌时出现LinkedIn登录错误
- 如何检查用户是否使用$routeChangeStart登录angularjs
- Node.js Passport成功登录后显示用户名
- 有登录表单时无法提交表单
- Google 加号登录不会返回id_token
- XMPP带内注册(XEP-0077):与简单的jid/pw登录不同,有哪些步骤