Как настроить использование JWK клиента с помощью Spring Security?

Как настроить клиент для авторизации с помощью JWT и валидации токена с использованием сервиса, который выдает и обновляет JWT токены с помощью RSA ключей, а также предоставляет JSON с информацией о JWK для валидации токена?
  • 18 января 2024 г. 15:58
Ответы на вопрос 1
Для настройки клиента для авторизации с использованием JWT токенов с валидацией через JWK (JSON Web Keys) в Spring Security, вам понадобится выполнить несколько шагов. Вот общий набор действий:

1. **Добавьте нужные зависимости Maven:**
   Убедитесь, что в вашем `pom.xml` файле есть зависимости для Spring Security и поддержки JWT:

   ```xml
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-oauth2-resource-server</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-oauth2-jose</artifactId>
   </dependency>
   ```

2. **Настройте Resource Server:**
   Настройте ваш Spring Boot приложение как Resource Server, укарывающий на OAuth 2.0 Authorization Server, который предоставляет JWK для валидации токенов.

   ```java
   @EnableWebSecurity
   public class SecurityConfig extends WebSecurityConfigurerAdapter {

       @Override
       protected void configure(HttpSecurity http) throws Exception {
           http
               .authorizeRequests(authorizeRequests -> 
                   authorizeRequests
                       .antMatchers("/public").permitAll()
                       .anyRequest().authenticated()
               )
               .oauth2ResourceServer(oauth2ResourceServer -> 
                   oauth2ResourceServer
                       .jwt(jwt -> 
                           jwt.decoder(JwtDecoders.fromIssuerLocation("https://your-auth-server.com"))
                       )
               );
       }
   }
   ```

   Здесь `https://your-auth-server.com` - это URL, на который указывает ваш Authorization Server. Используется `.fromIssuerLocation(issuerUri)`, который автоматически настраивает `JwtDecoder` для получения информации о JWK из конфигурации вашего Authorization Server.

3. **Конфигурация JWK Set URI:**
   Если конфигурация открытого URI для JWK Set не получается автоматически, вы можете установить его вручную:

   ```java
   @Bean
   public JwtDecoder jwtDecoder() {
       return NimbusJwtDecoder.withJwkSetUri("https://your-auth-server.com/.well-known/jwks.json").build();
   }
   ```
   
   Этот код создаёт `JwtDecoder` с указанным URI, откуда будут загружаться ключи для проверки цифровой подписи JWT токенов.

4. **Настройки свойств в application.yml (или application.properties):**
   В некоторых случаях, вы можете настроить проверку JWT, добавив соответствующие свойства в ваш `application.yml`:

   ```yaml
   spring:
     security:
       oauth2:
         resourceserver:
           jwt:
             issuer-uri: https://your-auth-server.com
   ```

5. **Валидация JWT Token:**
   Spring Security автоматически проверит JWT токен на каждый запрос, используя предоставленную информацию о JWK Set URI.

6. **Настройте корс и csrf если это необходимо:**
   В рамках защиты от XSS и CSRF аттак, убедитесь, что корректно настроены Cross-Origin Resource Sharing (CORS) и Cross-Site Request Forgery (CSRF) в вашем приложении.

Эти шаги дадут вам базовую настройку Resource Server с валидацией JWT токенов с использованием JWK, предоставляемых вашим Authorization Server. Убедитесь, что конфигурация вашего Authorization Server и Spring Security клиента совместимы, и ваш Authorization Server корректно реализует стандарты OpenID Connect для обнародования своих JWK.
Похожие вопросы