Как конфигурировать OAuth 2.0 в Spring Security и какой пакет за что отвечает?
Я изучаю Spring Security и в частности дошёл до OAuth 2.0. У меня полное не понимание и запутанность относительно того, как вообще это конфигурировать и использовать - я имею ввиду пакеты spring-security-oauth2-resource-server
, spring-security-oauth2-authorization-server
и spring-security-oauth2-client
.
Будет очень многословно пытаться приводить конкретные примеры чего я не понимаю, поэтому просто сформулирую четыре вопроса:
В чём отличие перечисленных модулей и когда какой использовать?
Допустим, есть задача: нужно написать сервер, где будет возможность регистрации и авторизации, а затем выдача собственного JWT-токена с помощью которого можно пользоваться REST API через заголовок Authorization и по своей сути решается она плюс минус так в самом простом варианте (сами методы контроллера, создание JWT и его подпись с помощью RSA ключей тут опущена, т.к. выйдет слишком много не нужного кода):
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, Converter<Jwt, UsernamePasswordAuthenticationToken> converter) throws Exception { http .authorizeHttpRequests(authorize -> authorize .requestMatchers( "/api/" + apiVersion + "/auth/register", "/api/" + apiVersion + "/auth/login" ) .permitAll() .anyRequest() .authenticated() ) .csrf(AbstractHttpConfigurer::disable) .cors(AbstractHttpConfigurer::disable) .httpBasic(AbstractHttpConfigurer::disable) .oauth2ResourceServer(configurer -> configurer. jwt((jwt) -> jwt.jwtAuthenticationConverter(converter)) ) .sessionManagement(configurer -> configurer .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .exceptionHandling(configurer -> configurer .authenticationEntryPoint(new BearerTokenAuthenticationEntryPoint()) .accessDeniedHandler(new BearerTokenAccessDeniedHandler()) ); return http.build(); }
, т.е. мы просто создали сервер ресурсов и благодаря нему у нас появился BearerTokenAuthenticationFilter в цепочке фильтров, который теперь будет преобразовывать и проверять наш токен. Но вот приходит задача: заказчик хочет добавить возможность выпускать и использовать в нашем приложении вход через GitHub и Google, а в дальнейшем и Apple, но при этом сохранить функциональность входа с помощью собственного JWT токена. Как в таком случае конфигурировать OAuth 2.0?
Следующий вопрос касается внедрения каких-либо менее известных систем. Допустим, ЮКасса. Она имеет соотвествующий стандартам механизм входа через OAuth с помощью
authorization_code
. Как её добавить в конфигурацию? Кстати говоря, что касается ЮКассы, то здесь токен нужен для взаимодействия с их API в будущем, а не для авторизации приложения, поэтому входить в приложения с помощью этого токена нельзя - его нужно просто перехватить и сохранить в базу данных.Ну и последний вопрос, а хотя вернее даже уточнение: меня интересует система без сохранения состояния, т.е.
SessionCreationPolicy.STATELESS