Что такое 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)
- Authorization Code — наиболее безопасный, для серверных приложений:
Пример
1. Клиент → Redirect на Authorization Server
2. Пользователь аутентифицируется и даёт согласие
3. Authorization Server → Redirect на клиент с authorization code
4. Клиент → Authorization Server: обмен code на access_token
5. Клиент → Resource Server: запрос с access_token
-
Authorization Code + PKCE — для SPA и мобильных приложений (рекомендуемый). Дополняет Authorization Code проверкой code_verifier / code_challenge для защиты от перехвата authorization code.
-
Client Credentials — для межсервисного взаимодействия (machine-to-machine):
Пример
POST /oauth/token
grant_type=client_credentials&client_id=myapp&client_secret=secret&scope=read
- 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).