Python使用twisted连接本地ejabberd 21.04报not-authorized授权错误如何解决
问题根因
- 你使用的
twisted.words库的basicClientFactory默认采用旧版非SASL明文认证机制,而ejabberd 21.04默认未开启该认证方式的支持,优先要求使用标准SASL认证 - ejabberd默认禁止在未加密的TCP连接中传输明文密码,即使你配置了
starttls_required: false也需要额外开启对应权限
解决方案
- 首先修改
ejabberd.yml中5222端口的配置,新增两个配置项开启兼容:
listen: - port: 5222 ip: "::" module: ejabberd_c2s max_stanza_size: 262144 shaper: none access: all starttls_required: false # 新增以下2行配置 auth_method: [plain, digest] allow_unencrypted_plain_auth: true
修改完成后重启ejabberd服务生效。
- 若修改配置后仍认证失败,可将twisted的认证方式替换为SASL认证,替换原有工厂构造逻辑的代码示例:
from twisted.words.protocols.jabber import sasl # 原有myJid、password定义不变 authenticator = sasl.SASLAuthenticator(myJid, password, mechanisms=['PLAIN']) factory = xmlstream.XmlStreamFactory(authenticator) # 后续的bootstrap事件绑定、connectTCP逻辑保持不变
- 可选验证步骤:
- 先用通用XMPP客户端(如Pidgin、Adium)使用相同的账号密码连接本地5222端口,确认账号密码本身可正常登录,排除账号密码输入错误问题
- 将ejabberd的
loglevel调整为5(debug级别),重启后再运行代码,可从日志中看到更详细的认证失败原因,方便进一步定位
内容的提问来源于stack exchange,提问作者Shadan Golestan
相关产品推荐
相关产品推荐

