Проблемы с использованием Spring Security с Okta OIDC JWT - PullRequest
1 голос
/ 09 ноября 2019

[ПОЖАЛУЙСТА, СМОТРИТЕ ПАРАМЕТРЫ ОБНОВЛЕНИЯ НИЖЕ ДЛЯ ПОСЛЕДНЕЙ ИТЕРАЦИИ]

Я пытаюсь настроить приложение REST Spring Boot с помощью Spring Security. Наш интерфейс аутентифицирует наших пользователей с помощью OIDC в ​​Okta и передает JWT в маркере авторизационного носителя. Okta использует PKCE.

Я ссылаюсь на следующий пример, и это, кажется, очень простая установка: https://docs.spring.io/spring-security-oauth2-boot/docs/current/reference/html/boot-features-security-oauth2-resource-server.html

Наше приложение Spring Boot будет только сервером ресурсов,поэтому я думаю, что мне нужно только следовать указаниям в разделах с 2.1 по 2.2.3. У меня есть @EnableResourceServer в моем приложении, и у меня есть следующее в application.yml:

spring:
  security:
    oauth2:
      resource:
        jwt:
          key-set-uri: https://dcsg-hub-dev.okta.com/oauth2/v1/keysZ?client_id=???

Когда я вызываю свое приложение с помощью Почтальона, я получаю ошибку 401:

{
    "error": "invalid_token",
    "error_description": "Invalid access token: eyJraWQ..."
}

Показывает действительный токен, который я могу проверить, вызвав конечную точку Okta userinfo. К сожалению, это не дает мне никакой другой информации.

В итоге я установил точки останова в классе org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter. При входе в код, вызываемый из этого местоположения, ошибка вызывается в коде в org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationManager:

public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    if (authentication == null) {
        throw new InvalidTokenException("Invalid token (token not found)");
    } else {
        String token = (String)authentication.getPrincipal();
        OAuth2Authentication auth = this.tokenServices.loadAuthentication(token);
        if (auth == null) {
            throw new InvalidTokenException("Invalid token: " + token);

, который вызывает следующий код в том же классе:

public OAuth2Authentication loadAuthentication(String accessTokenValue) throws AuthenticationException, InvalidTokenException {
    OAuth2AccessToken accessToken = this.tokenStore.readAccessToken(accessTokenValue);
    if (accessToken == null) {
        throw new InvalidTokenException("Invalid access token: " + accessTokenValue);

ItКажется, что код использует сам токен в качестве ключа для извлечения токена из хэш-карты. Как вы можете видеть выше, он использует getPrincipal() для получения «токена». Мне кажется, он считает, что токен должен быть идентификатором пользователя, который он пытается использовать для поиска токена пользователя. Кажется странным, что он использует токен в качестве ключа для получения значения, когда значение уже существует.

Есть идеи?

<<<<<<<<<<<<<< ОБНОВЛЕНИЕ >>>>>>>>>>>>>>

Я следовал за документом по этой ссылке: https://github.com/spring-projects/spring-security/tree/5.2.1.RELEASE/samples/boot/oauth2resourceserver-jwe

Мой application.yml теперь выглядит следующим образом:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://dcsg-hub-dev.okta.com
          jwk-set-uri: https://dcsg-hub-dev.okta.com/oauth2/v1/keys?client_id=

Теперь это определенно вызывает URI JWK, тогда как раньше этого не было. Однако теперь я получаю следующую ошибку:

Caused by: com.nimbusds.jose.proc.BadJOSEException: Signed JWT rejected: Another algorithm expected, or no matching key(s) found

Я установил точки останова в этом коде, и по любой причине kid, который возвращается в токене / JWT от Okta, не соответствует ни одному изключи которые в окте jwk-set-uri.

1 Ответ

0 голосов
/ 13 ноября 2019

Я узнал от Okta, что эта функция не поддерживается, вам нужно создать свой собственный сервер авторизации с API Access Management.

...