Gymterview
middle

Что такое OAuth 2.0 и как он работает?

OAuth 2.0 — протокол (фреймворк) авторизации, который позволяет стороннему приложению получить ограниченный доступ к HTTP-сервису от имени владельца ресурса, не раскрывая его учётные данные.

Аналогия из жизни: OAuth 2.0 — как выдача ключ-карты горничной в отеле. Вы (Resource Owner) не даёте горничной свой паспорт (пароль), а ресепшн (Authorization Server) выдаёт ей карту с ограниченным доступом (токен): только в вашу комнату и только до определённого времени.

Основные роли

Роль Описание
Resource Owner Пользователь, владелец данных
Client Приложение, запрашивающее доступ
Authorization Server Сервер, выдающий токены (Keycloak, Auth0 и др.)
Resource Server Сервер, хранящий защищённые ресурсы (наш API)

Основные потоки (Grant Types)

  1. Authorization Code — наиболее безопасный, для серверных приложений:
Пример
1. Клиент → Redirect на Authorization Server
2. Пользователь аутентифицируется и даёт согласие
3. Authorization Server → Redirect на клиент с authorization code
4. Клиент → Authorization Server: обмен code на access_token
5. Клиент → Resource Server: запрос с access_token
  1. Authorization Code + PKCE — для SPA и мобильных приложений (рекомендуемый). Дополняет Authorization Code проверкой code_verifier / code_challenge для защиты от перехвата authorization code.

  2. Client Credentials — для межсервисного взаимодействия (machine-to-machine):

Пример
POST /oauth/token
grant_type=client_credentials&client_id=myapp&client_secret=secret&scope=read
  1. Resource Owner Password Credentials — устаревший, не рекомендуется.
Настройка Spring Boot как Resource Server
@Configuration
@EnableWebSecurity
public class ResourceServerConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/public/**").permitAll()
                .anyRequest().authenticated())
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthConverter())))
            .build();
    }

    @Bean
    public JwtAuthenticationConverter jwtAuthConverter() {
        JwtGrantedAuthoritiesConverter converter = new JwtGrantedAuthoritiesConverter();
        converter.setAuthorityPrefix("ROLE_");
        converter.setAuthoritiesClaimName("roles");

        JwtAuthenticationConverter jwtConverter = new JwtAuthenticationConverter();
        jwtConverter.setJwtGrantedAuthoritiesConverter(converter);
        return jwtConverter;
    }
}

В application.yml:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://auth-server.example.com/realms/myrealm

На собеседовании: нужно назвать четыре роли и три основных потока (Authorization Code, PKCE, Client Credentials). Частая ошибка — путать аутентификацию и авторизацию: OAuth 2.0 — это протокол авторизации, а не аутентификации (для аутентификации — OpenID Connect поверх OAuth 2.0).