下发目标
为我的spring oauth2 jwt服务器配置有效的jwks
。
第一次尝试
遵循spring文档,我可以使用JWK Set URI的现成端点。它需要:
@Import(AuthorizationServerEndpointsConfiguration.class)
字符串
我已经添加。通过执行器检查Map的端点没有过滤jw
。
第二次尝试
按照相同的配置,我尝试使用下一个代码:
import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.RSAKey;
...
@FrameworkEndpoint
class JwkSetEndpoint {
KeyPair keyPair;
public JwkSetEndpoint(KeyPair keyPair) {
this.keyPair = keyPair;
}
@GetMapping("/.well-known/jwks.json")
@ResponseBody
public Map<String, Object> getKey(Principal principal) {
RSAPublicKey publicKey = (RSAPublicKey) this.keyPair.getPublic();
RSAKey key = new RSAKey.Builder(publicKey).build();
return new JWKSet(key).toJSONObject();
}
}
型
它产生
{
"keys" : [ {
"kty" : "RSA",
"e" : "AQAB",
"n" : "mWI2jtKwvf0W1hdMdajch-mFx9FZe3CZnKNvT_d0-2O6V1Pgkz7L2FcQx2uoV7gHgk5mmb2MZUsy_rDKj0dMfLzyXqBcCRxD6avALwu8AAiGRxe2dl8HqIHyo7P4R1nUaea1WCZB_i7AxZNAQtcCcSvMvF2t33p3vYXY6SqMucMD4yHOTXexoWhzwRqjyyC8I8uCYJ-xIfQvaK9Q1RzKRj99IRa1qyNgdeHjkwW9v2Fd4O_Ln1Tzfnk_dMLqxaNsXPw37nw-OUhycFDPPQF_H4Q4-UDJ3ATf5Z2yQKkUQlD45OO2mIXjkWprAmOCi76dLB2yzhCX_plGJwcgb8XHEQ"
} ]
}
型
使用access_token ping资源服务器失败:
{"error":"invalid_token","error_description":"Invalid JWT/JWS: kid is a required JOSE Header"}
型
第三次尝试
修改"/.well-known/jwks.json"
(jwt.io helps detect algorithm used for jwt
)的响应:
RSAKey key = new RSAKey.Builder(publicKey)
.keyID("1")
.keyUse(KeyUse.SIGNATURE)
.algorithm(JWSAlgorithm.RS256)
.build();
型
导致下一个响应:
{
"keys" : [ {
"kty" : "RSA",
"e" : "AQAB",
"use" : "sig",
"kid" : "1",
"alg" : "RS256",
"n" : "mWI2jtKwvf0W1hdMdajch-mFx9FZe3CZnKNvT_d0-2O6V1Pgkz7L2FcQx2uoV7gHgk5mmb2MZUsy_rDKj0dMfLzyXqBcCRxD6avALwu8AAiGRxe2dl8HqIHyo7P4R1nUaea1WCZB_i7AxZNAQtcCcSvMvF2t33p3vYXY6SqMucMD4yHOTXexoWhzwRqjyyC8I8uCYJ-xIfQvaK9Q1RzKRj99IRa1qyNgdeHjkwW9v2Fd4O_Ln1Tzfnk_dMLqxaNsXPw37nw-OUhycFDPPQF_H4Q4-UDJ3ATf5Z2yQKkUQlD45OO2mIXjkWprAmOCi76dLB2yzhCX_plGJwcgb8XHEQ"
} ]
}
型
使用access_token ping资源服务器会得到相同的结果:
{"error":"invalid_token","error_description":"Invalid JWT/JWS: kid is a required JOSE Header"}
型
提问
有任何想法或例子如何配置/.well-known/jwks.json
产生正确的jwks
?
附言
- 如果我使用公钥作为资源服务器上的本地资源-它工作。
- 我会很高兴任何工作解决方案(可能有人知道不同的
jwks
库,可以在spring-boot应用程序中使用)。
2条答案
按热度按时间oxosxuxt1#
有什么新进展吗?
我们正在研究基于签名的身份验证,https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures-12,
其中一个要求是实现/. well-known/jwks.json端点,这样我们就不必有单独的公钥分发机制。
我还没有这样做,但它看起来像:
字符串
uqcuzwp82#
要生成JWKS端点,您可以使用一些好的库,如nimbus-jose-jwt,但也可以完全不使用外部库。
为此,您需要生成密钥文件:
字符串
并转换为Java可以使用的内容:
型
然后可以使用以下代码生成JWKS端点响应:
型
你可能需要一些像
org.json
或Jackson这样的库来将JWKS数据序列化为JSON,除非你想使用StringBuilder。