Я постараюсь кратко объяснить часть архитектуры моего приложения, чтобы вы могли понять, чего я пытаюсь достичь. Я думаю, что это очень распространенный сценарий, но я не могу понять, как реализовать его в Springboot.
Что я хочу
Я хочу войти в систему со своего Angular FE, используя OAuth2 с использованием разных провайдеров. В этом случае я использую сервер авторизации, реализованный в Springboot (2.1.7.RELEASE), и я также аутентифицируюсь с использованием учетной записи Google. Получив токен доступа от одного провайдера, я хочу получить доступ к некоторым ресурсам в BE, но сначала токен доступа должен быть проверен.
То, что у меня есть до сих пор
В моем BE есть следующее AuthorizationServerConfig
:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
private BCryptPasswordEncoder passwordEncoder;
private AuthenticationManager authenticationManager;
@Autowired
public AuthorizationServerConfig(BCryptPasswordEncoder passwordEncoder, AuthenticationManager authenticationManager) {
this.passwordEncoder = passwordEncoder;
this.authenticationManager = authenticationManager;
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client_id")
.secret(passwordEncoder.encode("client_secret"))
.scopes("read", "write")
.authorizedGrantTypes("password", "refresh_token")
.accessTokenValiditySeconds(3600)
.refreshTokenValiditySeconds(3600);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.tokenStore(tokenStore())
.accessTokenConverter(accessTokenConverter());
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
final JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
tokenConverter.setSigningKey("SigningKey_VALUE");
return tokenConverter;
}
}
Затем у меня также есть WebSecurityConfigurerAdapter
, который использует userDetailsService
для проверки пользователя и реализацию UserDetailsService
для получения пользователи. Я могу ошибаться в том, что является основной функцией классов, о которых я упоминал ранее, но это конфигурация, которая работает, когда я получаю токен доступа, а затем проверяю его, когда он отправляется в BE в заголовках авторизации запроса.
Часть проверки каждого токена доступа, прикрепленного к запросу, поступает с этого сервера ресурсов (или я думаю, что это происходит из этого класса, исправьте меня, если я ошибаюсь):
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenStore(tokenStore());
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.cors()
.and()
.authorizeRequests()
.antMatchers("/api/security/oauth/**").permitAll()
.antMatchers("/api/usuarios/usuarios/**").hasAuthority("ADMINISTRADOR")
.anyRequest().authenticated()
.and()
.csrf().disable();
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
final JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
tokenConverter.setSigningKey("SigningKey_VALUE");
return tokenConverter;
}
@Bean
protected UrlBasedCorsConfigurationSource corsConfigurationSource() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin(CorsConfiguration.ALL);
config.addAllowedHeader(CorsConfiguration.ALL);
config.setAllowedMethods(Arrays.stream(HttpMethod.values()).map(HttpMethod::name).collect(Collectors.toList()));
source.registerCorsConfiguration("/**", config);
return source;
}
}
В мой Angular FE, мне удалось войти в систему с учетной записью Google, поэтому у меня есть другие данные, полученные из ответа Google, токен доступа и токен Id. Мой вопрос:
В соответствии с моей текущей реализацией, как я могу начать проверять эти токены доступа, полученные Google?
Буду признателен за любую помощь. Если у кого-то есть ответ, как это сделать в Springboot, это было бы оптимально, но я думаю, я мог бы заставить его работать, если бы кто-то хотя бы мог объяснить, как эта проблема решается на других языках.
Спасибо!