Как создать правильную конечную точку jwks для сервера jwt spring oauth2?
Выданная цель
Настроить /.well-known/jwks.json
для моего весеннего сервера oauth2 jwt с действующим jwks
.
1-я попытка
Следуя весенней документации, я могу использовать конечную точку коробки для JWK Set URI. Это требует:
@Import(AuthorizationServerEndpointsConfiguration.class)
Я добавил. Проверка сопоставленных конечных точек через исполнительный механизм, ничего не отфильтрованногоjw
.
2-я попытка
Следуя той же конфигурации, я попытался использовать следующий код:
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:
{"error":"invalid_token","error_description":"Invalid JWT/JWS: kid is a required JOSE Header"}
3-я попытка
Изменение ответа для "/.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 дает тот же результат:
{"error":"invalid_token","error_description":"Invalid JWT/JWS: kid is a required JOSE Header"}
Вопрос
Есть идеи или примеры, как настроить /.well-known/jwks.json
производить правильный jwks
?
PS
- Если я использую открытый ключ как локальный ресурс на сервере ресурсов - он работает.
- Буду рад любому рабочему решению (возможно кто знает другое
jwks
библиотеки, которые можно использовать в приложении с весенней загрузкой).
0 ответов
Есть какие-нибудь обновления для этого?
Мы изучаем аутентификацию на основе подписи, https://tools.ietf.org/html/draft-cavage-http-signatures-12,
Одним из требований будет реализация конечной точки /.well-known/jwks.json, поэтому нам не нужно иметь отдельный механизм распределения открытых ключей.
Я еще этого не делал, но похоже:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
return JWKSet.load(keyStore, (name) -> null).toPublicJWKSet();