Как я могу проверить токены доступа от разных провайдеров в Springboot? - PullRequest
0 голосов
/ 10 января 2020

Я постараюсь кратко объяснить часть архитектуры моего приложения, чтобы вы могли понять, чего я пытаюсь достичь. Я думаю, что это очень распространенный сценарий, но я не могу понять, как реализовать его в 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, это было бы оптимально, но я думаю, я мог бы заставить его работать, если бы кто-то хотя бы мог объяснить, как эта проблема решается на других языках.

Спасибо!

...