ejabberd 21.07配置JWT认证触发崩溃报错问题求助
问题根因
你遇到的崩溃不是JWT配置错误导致的,核心错误来自日志里的function not exported, [{crypto,hmac, [...], []}]:
Arch发行版滚动更新的Erlang运行时版本过高(≥24.x),移除了旧版的crypto:hmac/3接口,而你安装的ejabberd 21.07依赖的jose库仍然调用这个已废弃的接口,导致校验JWT签名时直接崩溃。
解决方案
优先选择以下任意一种方案修复依赖兼容问题:
- 升级ejabberd到22.05及以上版本,该版本已经完成了Erlang ≥24版本的接口适配,修复了hmac调用兼容问题
- 若要保留当前ejabberd版本,将系统Erlang运行时降级到23.x版本,匹配ejabberd 21.07的官方依赖要求
- 直接使用ejabberd官方提供的预编译二进制包或容器镜像,自带匹配的依赖运行环境,不会出现系统库版本冲突
依赖修复后配置校验项
依赖问题解决后,可按以下要求核对JWT配置,避免配置类错误:
- 配置文件中要明确指定
auth_method: jwt,同时配置jwt_jwk_path指向你的JWK文件绝对路径,确保ejabberd运行用户对该文件有读权限 - 生成JWT时需满足要求:
- 签名算法固定为HS256
- payload必须携带
jid字段,值为完整的Jabber ID(格式:用户名@你的服务域名) - 签名密钥使用JWK中
k值的base64url解码后的原始二进制值,不要额外转码
- 客户端认证时,用户名字段填JWT中
jid对应的用户名,密码字段填完整的JWT字符串即可
内容的提问来源于stack exchange,提问作者Cronoburn
相关产品推荐
相关产品推荐

