与 ejabberd 一起使用的 JWT 秘密?
JWT secret to use with ejabberd?
我正在关注这些:
- 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 类型:
"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`
我正在关注这些:
- 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 类型:
"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`