使用Tigase与xmpp.js注册XMPP用户成功但数据库无记录
XMPP注册异常:Tigase返回成功响应但数据库无用户记录
刚接触XMPP,使用Tigase服务器与xmpp.js库开发,其他功能正常,但注册新用户时,明明收到服务器返回的成功响应,搭配Tigase的外部MySQL数据库里却没有生成对应的用户记录。
我的代码
const xmpp = client({ service: "ws://localhost:5290", domain: "8662d6b4746d", }); xmpp.reconnect.stop() xmpp.timeout = 5000 xmpp.on("online", async (address) => { console.log("Online!"); await xmpp.iqCaller.request( xml('iq', {type: 'get', to: '8662d6b4746d'}, xml('query', {xmlns: 'jabber:iq:register'}) ) ); await xmpp.iqCaller.set( xml("query", {xmlns: "jabber:iq:register"}, xml("username", {}, "username"), xml("password", {}, "password"), xml("email", {}, "email@email.com") ), '8662d6b4746d' ) }); xmpp.on("status", (status) => { console.debug(status); }); xmpp.on("stanza", async (stanza) => { console.log(stanza.toString()) }); xmpp.start().catch(console.error);
第一个IQ请求的响应
<iq from="8662d6b4746d" id="e7t9y4ll60" to="ed0e2dd2-4701-4631-8d16-dfb16b29babf@8662d6b4746d/36525451-tigase-81" type="result" xmlns="jabber:client"> <query xmlns="jabber:iq:register"> <instructions>Please provide the following information to sign up for an account Please also provide your e-mail address (must be valid!) to which we will send confirmation link. </instructions> <x type="form" xmlns="jabber:x:data"> <title>Account Registration</title> <instructions>Please provide the following information to sign up for an account Please also provide your e-mail address (must be valid!) to which we will send confirmation link. </instructions> <field var="FORM_TYPE" type="hidden"> <value>jabber:iq:register</value> </field> <field var="username" label="Username" type="text-single"> <required/> <value></value> </field> <field var="password" label="Password" type="text-private"> <required/> <value></value> </field> <field var="email" label="Email (MUST BE VALID!)" type="text-single"> <required/> <value></value> </field> </x> </query> </iq>
发送的注册XML请求
<iq type="set" id="3peq9kolof" xmlns="jabber:client"> <query xmlns="jabber:iq:register"> <username>user</username> <password>pass</password> <email>email@email.com</email> </query> </iq>
最终响应
<iq from="8662d6b4746d" id="qmfce9m3s4" to="ed0e2dd2-4701-4631-8d16-dfb16b29babf@8662d6b4746d/36525451-tigase-81" type="result" xmlns="jabber:client"/>
服务器流特性(显示支持注册)
<stream:features xmlns:stream="http://etherx.jabber.org/streams"> <sm xmlns="urn:xmpp:sm:3"/> <register xmlns="http://jabber.org/features/iq-register"/> <csi xmlns="urn:xmpp:csi:0"/> <ver xmlns="urn:xmpp:features:rosterver"/> <sub xmlns="urn:xmpp:features:pre-approval"/> <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/> <session xmlns="urn:ietf:params:xml:ns:xmpp-session"> <optional/> </session> <c node="https://tigase.net/tigase-xmpp-server" ver="DVBeLFh/TPj/59OCEybudilMhLM=" hash="SHA-1" xmlns="http://jabber.org/protocol/caps"/> </stream:features>
问题分析与解决方案
核心问题:注册格式不匹配
从服务器返回的第一个IQ响应可以看到,Tigase要求使用XEP-0004数据表单格式提交注册信息,而不是传统的直接嵌套<username>/<password>节点的格式。虽然服务器返回了成功响应,但实际上因为格式不符合要求,没有执行用户创建逻辑。
修改后的注册代码
将注册请求改为表单格式:
xmpp.on("online", async (address) => { console.log("Online!"); // 获取注册表单(可省略,直接构造表单提交) await xmpp.iqCaller.request( xml('iq', {type: 'get', to: '8662d6b4746d'}, xml('query', {xmlns: 'jabber:iq:register'}) ) ); // 用数据表单格式提交注册信息 await xmpp.iqCaller.set( xml("iq", {type: 'set', to: '8662d6b4746d'}, xml("query", {xmlns: "jabber:iq:register"}, xml("x", {type: "submit", xmlns: "jabber:x:data"}, xml("field", {var: "FORM_TYPE", type: "hidden"}, xml("value", {}, "jabber:iq:register") ), xml("field", {var: "username"}, xml("value", {}, "username") ), xml("field", {var: "password"}, xml("value", {}, "password") ), xml("field", {var: "email"}, xml("value", {}, "email@email.com") ) ) ) ) ); });
额外检查项
- Tigase邮箱验证配置:如果服务器开启了邮箱验证(响应中提示需发送确认链接),用户创建后会处于待激活状态,数据库中可能存在记录但标记为未激活,需检查
users表的account_status字段。 - 数据库存储组件配置:确认Tigase已正确配置使用MySQL存储组件,检查
config.tdsl中的'user-repository'配置是否指向MySQL。 - 服务器日志:查看Tigase的日志文件,搜索注册相关的错误信息,可能能找到未写入数据库的具体原因。
内容的提问来源于stack exchange,提问作者Gabbr Issimo
相关产品推荐
相关产品推荐

