ejabberd 20.04 mod_pubsub支持XEP-0163(PEP)返回403错误排查
ejabberd 20.04 PEP服务403故障排查指南
为什么调整access_create_node完全没有效果
- 你之前修改的
access_create_node参数仅管控公共PubSub服务节点的创建权限,对绑定在用户自身JID下的PEP节点没有任何鉴权效力,这是调整配置后客户端报错完全没有变化的核心原因。 - 403错误和外部认证机制无关:PEP的权限校验是ejabberd本地完成的ACL判断,整个流程不会向外部认证脚本发起请求,这也是你在外部认证日志里看不到异常请求的原因。
- 旧版本功能正常的差异来源:你2009年使用的ejabberd 2.x系列默认对所有本地用户放开PEP操作权限,没有独立的校验规则;从ejabberd 19.x版本开始,PEP的鉴权逻辑从通用PubSub模块中拆分出来,缺失显式配置时服务端会默认返回403拦截请求,属于版本迭代带来的配置变更,不是代码故障。
实际修复操作步骤
- 补全PEP专属的访问控制规则
在ejabberd.yml的全局access配置段补充以下规则,所有规则和你现有配置的结构保持一致即可:access: # 保留原有所有访问规则不要改动 # 新增PEP专属权限配置 pep_publish: local: allow # 允许本地用户发布自身名下PEP节点的内容 pep_access: local: allow # 允许本地用户操作自身名下的PEP节点 pubsub_createnode: local: allow # 允许本地用户创建PEP类节点 - 确认模块加载状态没有被主机配置覆盖
你通过append_host_config为MYSERVER.COM单独配置了外部认证参数,需要确认全局配置的mod_pubsub模块和pep插件没有被主机段的配置覆盖。可以执行ejabberd自带的管理命令查看实际加载的模块:
确认列表中存在ejabberdctl modules_loadedmod_pubsub后,再通过模块信息查询命令确认PEP插件处于激活状态,避免主机配置段的空模块声明把全局模块的加载状态冲掉。 - 异常ACL规则排查
如果补全上述规则后依然报403,可以临时将三个PEP相关规则调整为全用户允许,重载配置后再测试Psi+客户端的发布操作:
如果此时发布操作可以正常完成,说明原有配置里存在某条deny规则的匹配范围过宽,拦截了本地用户的PEP操作,逐段核对ACL的用户匹配范围即可定位问题。access: pep_publish: all: allow pep_access: all: allow pubsub_createnode: all: allow
注意:调整完配置后必须执行
ejabberdctl reload_config重载服务配置,不要仅重启客户端,否则会因为服务端配置未生效重复复现403错误。
内容的提问来源于stack exchange,提问作者StinGer
相关产品推荐
相关产品推荐

