Angular Spring Oauth2 Неверные учетные данные - PullRequest
1 голос
/ 16 февраля 2020

Когда я пытаюсь вызвать конечную точку API входа в моем приложении Angular, я получаю html с сообщением «Неверные учетные данные», но если я пытаюсь получить доступ к конечной точке входа в браузере, я могу успешно войти в систему. Я также могу получить токен для почтальона и вызвать мой API.

AuthorizationServerConfigurerAdapter:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;

    @Autowired 
    private AuthenticationManager authenticationManager;
    @Autowired 
    private UserDetailsService userDetailsService;
    @Autowired 
    private PasswordEncoder oauthClientPasswordEncoder;


    @Bean
    JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        ((DefaultAccessTokenConverter) converter.getAccessTokenConverter())
                .setUserTokenConverter(userAuthenticationConverter());

        return converter;
    }

    @Bean
    public TokenEnhancer tokenEnhancer() {
        return new CustomTokenEnhancer();
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public OAuth2AccessDeniedHandler oauthAccessDeniedHandler() {
        return new OAuth2AccessDeniedHandler();
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
        oauthServer.tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()")
                .passwordEncoder(oauthClientPasswordEncoder);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

    @Bean
    public UserAuthenticationConverter userAuthenticationConverter() {
        DefaultUserAuthenticationConverter defaultUserAuthenticationConverter = new DefaultUserAuthenticationConverter();

        defaultUserAuthenticationConverter.setUserDetailsService(userDetailsService);
        return defaultUserAuthenticationConverter;
    }


    @Override
    public void configure(final AuthorizationServerEndpointsConfigurer endpoints) {
        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(
        List.of(new CustomTokenEnhancer(), accessTokenConverter()));


        endpoints.accessTokenConverter(accessTokenConverter())
                .userDetailsService(userDetailsService)
                .authenticationManager(authenticationManager)
                .tokenEnhancer(tokenEnhancerChain);
    }

}

ResourceServerConfigurerAdapter

@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    private static final String SECURED_PATTERN = "/secured/**";
    private static final String SECURED_READ_SCOPE = "#oauth2.hasScope('read')";
    private static final String SECURED_WRITE_SCOPE = "#oauth2.hasScope('write')";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId("resource-server-rest-api").stateless(false);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {

        http.cors()
            .and()
            .antMatcher("/api/**")
            .authorizeRequests()
            .antMatchers("/**", "/login**", "/error**", "/api/auth/**")
            .permitAll();

        http.authorizeRequests()
            .antMatchers("/api/**")
            .authenticated();

    }
}

WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
public class Oauth2WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired 
    private UserDetailsService userDetailsService;
    @Autowired 
    private PasswordEncoder userPasswordEncoder;

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
                auth.userDetailsService(userDetailsService).passwordEncoder(userPasswordEncoder);
    }

    private static final String[] CSRF_IGNORE = {"/login/**", "/signup/**"};

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.cors()
            .and()
            .antMatcher("/**")
            .authorizeRequests()
            .antMatchers("/**", "/login**", "/error**", "/api/auth/**")
            .permitAll();

        http.cors()
            .and()
            .formLogin();

        http.httpBasic()
            .and()
            .csrf()
            .ignoringAntMatchers(CSRF_IGNORE)
            .csrfTokenRepository(csrfTokenRepository())
            .and()
            .addFilterAfter(new CustomCsrfFilter(), CsrfFilter.class);
    }

    private CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName(CustomCsrfFilter.CSRF_COOKIE_NAME);
        return repository;
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList ("*"));
        configuration.setAllowedHeaders(Arrays.asList(("*")));

        configuration.setAllowCredentials(true);
        configuration.setAllowedMethods(Arrays.asList("GET", "HEAD", "OPTIONS", "POST", "PUT", "DELETE"));
        //applyPermitDefaultValues(
                UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
                source.registerCorsConfiguration("/**", configuration);
                return source;
    }
}

Angular Служба входа в систему

login(email: string, password: string): Observable<any> {

    const httpOptions = {
        headers: new HttpHeaders({ 'Content-Type': 'application/json' , 'Access-Control-Allow-Credentials': 'true'})
    };

    return this.http.post('http://localhost:8080/login', {  
        username: email,
        password: password
    }, 
    httpOptions).pipe(tap((resp: any) => {

        console.log(resp);

        this.loggedIn.next(true);
        this.saveToken(resp.user.token);

        if(resp && resp.user && resp.user.name) {
            localStorage.setItem('currentUser', JSON.stringify( resp.user.name));
        }}), 
        catchError( err => {
            throw err;
        })
    );
}

Обновление: я думаю, что моя проблема в том, что пользователь / пароль не приходит в систему безопасности Spring, поэтому у меня появляется эта ошибка

2020-02-22 15: 43: 38.452 DEBUG 9912 --- [nio-8080-exe c -2] ossadao.DaoAuthenticationProvider: Пользователь '' не найден 2020-02-22 15: 43: 38.458 DEBUG 9912 --- [nio-8080-exe c -2] waUsernamePasswordAuthenticationFilter: сбой запроса аутентификации: org.springframework.security.authentication.BadCredentialsException: неверные учетные данные org.springframework.security.authentication.BadCredentialsException: плохие учетные данные 1019 *

вот полные журналы безопасности весны: https://easyupload.io/dkjqi8

...