与 ejabberd 一起使用的 JWT 秘密?

JWT secret to use with ejabberd?

我正在关注这些:

并使用 https://mkjwk.org/ 创建了如下所示的 secret.key 以匹配上面第一个 URL 中的示例:

根据 https://auth0.com/blog/navigating-rs256-and-jwks/ 因为这是 HS 类型:

"Simply put HS256 must share a secret with any client or API that wants to verify the JWT"

所以我天真地假设使用 "k" 作为在发布 JWT 的服务器上签署 JWT 的秘密,以便在任何 XMPP 客户端的密码字段中使用(stanza.io 和 pidgin桌面)。

我误会了什么?我已经确认 ejabberd 正确启动(通过 ejabberdctl live 和 loglevel 4):

auth_method: [jwt, ldap]
jwt_key: /opt/ejabberd/conf/secret.jwk

而且我仍然可以在我们的目录服务器中使用密码进行身份验证,但我不能使用 JWT。我认为我没有正确生成它,因为我只是像普通共享密钥 JWT 一样对其进行签名。

谢谢, 加文.

"k" 是用于签署您生成的 JWT 的秘密,您假设正确。

但是 https://mkjwk.org(和 jabber)使用 Base64-url (RFC 4648 §5) 编码的秘密。 请在签署 JWT 之前尝试解码 "k" 的值,因为任何其他库(和算法)通常不期望编码的秘密,特别是 url 编码的秘密

您可以查看 https://jwt.io/ 以手动创建或修改您的 JWT 并查看它们发生了什么,可以选择是否对密码进行编码。然而,它透明地处理 base64-url 编码。

我能够使用 jwt 令牌进行身份验证,使用“k”签署 JWT,放置密钥集 `

"keys": [
    {
        "kty": "oct",
        "use": "sig",
        "kid": "",
        "k": "",
        "alg": "HS256"
    }
]

` 在 secret.jwk 中。在 strophe.connect() 中传递 jabber id 和 jwt 令牌后,它就连接了。 这是我的后端配置

      `auth_method: [jwt, sql]
       jwt_key: /usr/local/etc/ejabberd/secret.jwk
       default_db: sql
       new_sql_schema: true
       sql_type: mysql

       access_rules:
       jwt_only:
        deny: admin
        allow: all
       local:
        allow: all
       c2s:
         deny: blocked
         allow: all
       announce:
         allow: admin
      configure:
        allow: admin
      muc_create:
        allow: all
      pubsub_createnode:
       allow: local
      trusted_network:
       allow: loopback

     jwt_auth_only_rule: jwt_only`