Используя Spring-security-oauth2 Сервер авторизации с ребенком и JWKS? - PullRequest
0 голосов
/ 31 декабря 2018

Следуя документации здесь и там , мне удалось настроить сервер авторизации, который выдает маркеры доступа JWT, подписанные асимметричным ключом, которые локально проверяются сервером ресурсов с помощьюлокальная копия открытого ключа.Пока все хорошо.

Моя конечная цель состоит в том, чтобы серверы ресурсов использовали конечную точку JWKS на сервере авторизации и использовали заголовок 'kid' в JWT, чтобы найти правильный ключ в JWKS и проверить локально,поддержка вращения ключа.Я нашел , как заставить Сервер авторизации предоставить конечную точку JWKS , а также , как указать key-set-uri для сервера ресурсов .

ОднакоПохоже, что

  • публиковать значения JID (key id) в JWKS
  • невозможно, включая JWT

.Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Имея ту же проблему, я наткнулся на этот пост.Поэтому я надеюсь, что это будет кому-то полезно.Я не думаю, что это лучшее решение, поэтому, возможно, кто-то придумает лучший ответ, я надеюсь, например, установить какой-нибудь внешний компонент.

Справочная информация: Магазин Jwk сравнивает KID в заголовке токена стот, который находится в памяти, если он недоступен, запросит хорошо известную конечную точку

. Поэтому, добавив KID в JwkSetEndpoint, вы получите файл json с ребенком внутри.рядом с этим вам нужно получить KID в заголовке токена jwt.

мое решение в моем классе, которое расширяет JwtAccessTokenConverter

@Override
protected String encode(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
    String content = null;
    try {
        content = objectMapper.formatMap(getAccessTokenConverter().convertAccessToken(accessToken, authentication));
    } catch (Exception e) {
        throw new IllegalStateException("Cannot convert access token to JSON", e);
    }
    Map<String, String> headers = getJwtHeader();

    String token = JwtHelper.encode(content, signer, headers).getEncoded();
    return token;
}

рядом с заголовком KID, который Tokenstore ожидает использованиязаголовок установлен для подписи.мне также пришлось переопределить объект подписавшего, потому что я застрял с подписчиком hmac вместо желаемого RsaSigner.

0 голосов
/ 15 марта 2019

Я нашел способ установить kid в конечной точке jwks:

@FrameworkEndpoint
public class JwkSetEndpoint {
    private final KeyPair keyPair;

    public JwkSetEndpoint(KeyPair keyPair) {
        this.keyPair = keyPair;
    }

    @GetMapping("/.well-known/jwks.json")
    @ResponseBody
    public Map<String, Object> getKey() {
        RSAPublicKey publicKey = (RSAPublicKey) this.keyPair.getPublic();
        RSAKey key = new RSAKey.Builder(publicKey)
                .keyID("YOUR_KID_HERE")
                .keyUse(KeyUse.SIGNATURE).build();
        return new JWKSet(key).toJSONObject();
    }
}

То, что я не нашел, это способ установить его в заголовке JWT.

...