Декодировать Spring Boot 2.1 в кодировке JWT OAuth2 на сервере ресурсов - PullRequest
0 голосов
/ 18 марта 2019

Попытка обновить существующие службы ресурсов с Spring Boot 1.x до 2.x. Spring Security 4.5 работает на сервере аутентификации и кодирует токены JWT следующим образом:

  @Bean
  public JwtAccessTokenConverter jwtAccessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setSigningKey(privateKey);
    converter.setVerifierKey(publicKey);
    return converter;
  }

Сервер ресурсов, обновленный до Spring Boot 2.1.3.RELEASE выдает эту ошибку:

OAuth2AuthenticationProcessingFilter:165 : 
Authentication request failed: error="invalid_token",
error_description="Invalid access token:****..."

Журнал показывает, что OAuth2AuthenticationProcessingFilter использует MappingJackson2HttpMessageConverter для извлечения токена JWT. Автоконфигурация Spring Security должна предоставлять бин JwtAccessTokenConverter вместо бина MappingJackson2HttpMessageConverter, так как в моем файле свойств есть значение ключа:

  security:
    oauth2:
      resource:
        jwt:
          key-value: |
            -----BEGIN PUBLIC KEY-----
            ...
            -----END PUBLIC KEY-----

Вот класс Spring Security ResourceServerTokenServiceConfiguration, который должен его обнаружить. Свойство соответствует «security.oauth2.resource.jwt.key-value».

  public ConditionOutcome getMatchOutcome(ConditionContext context,
            AnnotatedTypeMetadata metadata) {
    ConditionMessage.Builder message = ConditionMessage
                .forCondition("OAuth JWT Condition");
    Environment environment = context.getEnvironment();
    String keyValue = environment
                .getProperty("security.oauth2.resource.jwt.key-value");
    String keyUri = environment
                .getProperty("security.oauth2.resource.jwt.key-uri");
    if (StringUtils.hasText(keyValue) || StringUtils.hasText(keyUri)) {
      return ConditionOutcome
                    .match(message.foundExactly("provided public key"));
    }
    return ConditionOutcome
                .noMatch(message.didNotFind("provided public key").atAll());
  }

Это зависимости безопасности сервера ресурсов:

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
  </dependency>

Это конфигурация сервера ресурсов. По сути, это то же самое, что было в Spring Boot 1.5.x.

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

  private static final String RESOURCE_ID = "my-service";

  @Override
  public void configure(final HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().authenticated();
  }

  @Override
  public void configure(ResourceServerSecurityConfigurer resources) {
    resources.resourceId(RESOURCE_ID);
  }
}

Что мне не хватает?

1 Ответ

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

Проблема была проблема со свойствами. Я переместил «security.oauth2» в «spring.security.oauth2». Когда я включил ведение журнала для org.springframework.boot.autoconfigure.security.oauth2 и увидел это:

did not match due to OAuth Client ID did not find security.oauth2.client.client-id property

Итак, я решил попробовать убрать свойства oauth2 из-под «весны». и он смог извлечь токен JWT.

...