OAuth 2.0 — это протокол авторизации, который позволяет приложениям получать ограниченный доступ к пользовательским данным на других сервисах без необходимости раскрывать пароль пользователя. OAuth 2.0 широко используется для интеграции с социальными сетями, API и облачными сервисами, такими как Google, Facebook, GitHub и другими.
Перед использованием OAuth 2.0 клиент должен зарегистрироваться на сервере авторизации. В процессе регистрации клиент получает:
Клиент перенаправляет пользователя на сервер авторизации для получения разрешения на доступ к данным. Запрос включает:
code
для Authorization Code Flow).Пример URL для запроса авторизации:
https://authorization-server.com/auth?
response_type=code&
client_id=CLIENT_ID&
redirect_uri=REDIRECT_URI&
scope=read_profile&
state=STATE
Пользователь видит запрос на предоставление доступа и решает, разрешить ли его. Если пользователь соглашается, сервер авторизации перенаправляет его обратно на клиент с кодом авторизации (Authorization Code).
Пример перенаправления:
https://client-app.com/callback?
code=AUTHORIZATION_CODE&
state=STATE
Клиент отправляет код авторизации на сервер авторизации для получения токена доступа. Запрос включает:
Пример запроса:
POST /token HTTP/1.1
Host: authorization-server.com
Content-Type: application/x-www-form-urlencoded
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
code=AUTHORIZATION_CODE&
redirect_uri=REDIRECT_URI&
grant_type=authorization_code
Сервер авторизации проверяет запрос и, если все в порядке, выдает токен доступа и, возможно, токен обновления.
Пример ответа:
{
"access_token": "ACCESS_TOKEN",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "REFRESH_TOKEN",
"scope": "read_profile"
}
Клиент использует токен доступа для запроса данных у сервера ресурсов. Токен передается в заголовке Authorization
.
Пример запроса:
GET /profile HTTP/1.1
Host: resource-server.com
Authorization: Bearer ACCESS_TOKEN
Если токен доступа истек, клиент может использовать токен обновления для получения нового токена доступа.
Пример запроса:
POST /token HTTP/1.1
Host: authorization-server.com
Content-Type: application/x-www-form-urlencoded
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
refresh_token=REFRESH_TOKEN&
grant_type=refresh_token
Рассмотрим пример реализации OAuth 2.0 с использованием Spring Security:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class OAuth2SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, ClientRegistrationRepository clientRegistrationRepository) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.oauth2Login(oauth2 -> oauth2
.defaultSuccessUrl("/home", true)
)
.logout(logout -> logout
.logoutSuccessHandler(new OidcClientInitiatedLogoutSuccessHandler(clientRegistrationRepository))
);
return http.build();
}
}
Следование этим принципам поможет вам успешно интегрировать OAuth 2.0 в ваше приложение и обеспечить безопасность пользовательских данных.