与 ejabberd 一起使用的 JWT 秘密?

Posted

技术标签:

【中文标题】与 ejabberd 一起使用的 JWT 秘密?【英文标题】:JWT secret to use with ejabberd? 【发布时间】:2020-08-12 21:18:30 【问题描述】:

我正在关注这些:

https://www.process-one.net/blog/ejabberd-19-08/ https://docs.ejabberd.im/admin/configuration/authentication/#jwt-authentication

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

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

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

所以我天真地假设在服务器上使用“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 一样对其进行签名。

谢谢, 加文。

【问题讨论】:

有没有人使用 JWK 中的共享密钥生成 JWT?他们可以用任何语言向我指出一些文档?不关心它是什么语言:-) 【参考方案1】:

“k”是用于签署您生成的 JWT 的密钥,您认为是正确的。

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

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

【讨论】:

“钥匙”:[ “KTY”: “辛”, “使用”: “SIG”, “孩子”: “测试”, “K”:“0_9uMKBuLT3EmKEqOuFG5Srl9TD1RCw44pgSPeT9qykpTGdQWQi5AnIqxevfIccpr-A_J08D2t0lf1tAK-LRLCbWeewfPptqHS_HxwaeQIcSwO6IP2POIRzc28Z9XftuR7zk- T63C0ZtWyUvAdm0S3LitCjUdFAnacWQItLc9oswUjWt4w2l5tW-Kcp495lWK9SbovAofO5kgqqDkMZqQyQtbRUAI6EjHJDu0XWAap7ib55Bj19D902nzUWOPsin3LcWO0_FgbcHYomCbo7YXB7kUkWR3lVgAUisYbeQ9HXGkGqdvoRlH7XLhRU0TfzS3TstynA8xbCj66ew9ebzTA”, “ALG”: “HS256”] 跨度> 是 JSON,但 k 值不会解码为 ascii。应该吗? 不,密钥是二进制的,随机 512 位(或您选择的任何长度)不会解码为任何可读的内容。 谢谢@Panter4,你拯救了我的一天!!在使用它生成我的令牌之前解码(base64-decode)“k”使其工作。我不知道这些工具总是生成 base64 编码的令牌,因此我必须在签名之前进行解码。【参考方案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`

【讨论】:

你的意思是k和kid应该一直是空白的还是我需要用我的内容替换它?我使用了你的并生成了一个令牌,但没有和我一起工作。 我的密钥文件看起来像下面 “KTY”: “辛”, “使用”: “SIG”, “K”: “XckBSF7uaA5fTR4JK1QkLaguwh9MO70__kd3s8lPTWaVmbOLPE8JBIG1yPs3in9YSJER2QdxjerNaLT_6OhmX2JnB_zeUz1m7EN-ThtbKXUjwauUMoT4PE_fyuqPQMvW-rsAkBjkz0MM_rKm30IxNN3oeXdhEIhMHlVXNumMwzcG7rctUHuFZmxsNKB1CJhTgRSJA7u4Ol0Fm07KA9E4glwK-XdeYza0nMuv3CC8P72i_1eCwBs2UXRyj4VnRrdjZflY0IomZ7iDowdldJwx-WVN51xhtda8dlNMa-p_TJrKjNhBG6f_5afNWzLB9hYJ5-AZcMksZRPgafAvUAOiyw” , "alg": "HS256" 任何机构都可以帮助我生成令牌,我可以登录到我的 ejabbred 吗?

以上是关于与 ejabberd 一起使用的 JWT 秘密?的主要内容,如果未能解决你的问题,请参考以下文章

JWT 身份验证方案中的刷新令牌是不是应该使用与访问令牌不同的秘密进行签名?

将 JWT 与 Google App Engine 结合使用

在 JWT 中存储秘密信息,使用 Node.js - Express 后端

使用带有动态/用户相关秘密的“nestjs/jwt”签名

NestJS JWT 策略需要一个秘密或密钥

与 CATiledLayer 一起使用时,UIView 的“contentScaleFactor”背后的秘密是啥?