2

我正在关注这些:

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

八进制键类型

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

“简单地说,HS256 必须与任何想要验证 JWT 的客户端或 API 共享一个秘密”

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

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

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

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

谢谢,加文。

4

2 回答 2

4

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

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

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

于 2020-05-28T15:41:11.533 回答
2

我能够使用 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`
于 2020-09-07T15:11:44.497 回答