Проверка токена доступа от Google с помощью Spring Security - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь аутентифицировать вызовы API с помощью моего бэкэнда с весенней загрузкой, предоставляя ему токен доступа, полученный от Google.

Из того, что я понимаю в документации, этого должно быть достаточно, чтобыпросто объявите

security.oauth2.resource.jwk.key-set-uri=https://www.googleapis.com/oauth2/v3/certs

в файле application.properties вместе с включением сервера ресурсов и веб-безопасности.

Маркер отправляется в заголовке в форме

'Authorization': 'Bearer ya29.ImCQBz5-600zVNsB[...]ka-x5kC[...]hvw-BGf3m5Bck-HF[...]44'

Когда я пытаюсь аутентифицироваться, я получаю 401 Несанкционированную ошибку со следующей консольной ошибкой:

OAuth2AuthenticationProcessingFilter: Authentication request failed: error="invalid_token", error_description="An I/O error occurred while reading the JWT: Invalid UTF-8 start byte 0xad at [Source: (byte[])"??"; line: 1, column: 3]

Я надеюсь использовать большую часть того, что я могу, из библиотек безопасности Spring, но япопытался написать свои собственные простые bean-компоненты для управления токенами.

@Configuration
@EnableResourceServer
@EnableWebSecurity
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().hasRole("USER");
    }

    @Bean
    public TokenStore tokenStore() {
        return new jwkTokenStore("https://www.googleapis.com/oauth2/v3/certs");
    }

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        return defaultTokenServices;
    }
    @Override
        public void configure(ResourceServerSecurityConfigurer config) {
        config.tokenServices(tokenServices());
    }
}

Я ожидаю аутентификации токена и возможности отображения информации.

Нужно ли мне писать свои собственные функции для обработки этого

1 Ответ

0 голосов
/ 27 сентября 2019

Может быть, вам нужно реализовать WebSecurityConfigurerAdapter

@Configuration

@RequiredArgsConstructor
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {

    private final AADAppRoleStatelessAuthenticationFilter appRoleAuthFilter;

    private final RestAuthenticationEntryPoint unauthorizedHandler;

    private final RestAccessDeniedHandler accessDeniedHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();

        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.authorizeRequests()
                .antMatchers("/actuator/refresh").hasRole("Admin")
                .antMatchers("/actuator/health").permitAll()
                .anyRequest().fullyAuthenticated();

        http.addFilterBefore(appRoleAuthFilter, UsernamePasswordAuthenticationFilter.class);

        http.exceptionHandling()
                .accessDeniedHandler(accessDeniedHandler)
                .authenticationEntryPoint(unauthorizedHandler);

    }
}
...