Получение пустого заголовка авторизации в Spring Boot от запросов с Angular 7, но почтальон работает нормально - PullRequest
0 голосов
/ 21 января 2020

Я получаю нулевой заголовок авторизации, когда отправляю запрос на внутренний контроллер, разработанный с использованием Spring Boot. Но когда я отправляю тот же запрос почтальону, выполняется поиск правильного API, и данные правильно выбираются из серверной части.

Со стороны Spring Boot, вот код для JwtSecurityConfiguration.java:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
        .authorizeRequests()
        .antMatchers(HttpMethod.OPTIONS, "**/**").permitAll()
        .antMatchers("/auth/**").permitAll()
        .anyRequest().authenticated()
        .and()
        .exceptionHandling().authenticationEntryPoint(entryPoint)
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.addFilterBefore(authenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
        http.headers().cacheControl();
    }

Я получаю заголовок авторизации null в JwtAuthenticationToken.java:

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException, IOException, ServletException {
        String header = request.getHeader("Authorization");
        if (header == null || !header.startsWith("Bearer ")) {
            System.err.println("Header: " + header);
            LOGGER.error("JWT Token is either missing from HTTP header or has been provided in an incorrect format!");
            throw new AuthenticationCredentialsNotFoundException(
                    "JWT Token is either missing from HTTP header or has been provided in an incorrect format!");
        }
        String authenticationToken = header.substring(7);
        JwtAuthenticationToken jwtAuthenticationToken = new JwtAuthenticationToken(authenticationToken);
        LOGGER.error("JWT Token has been received successfully. Authentication is in progress...");
        return getAuthenticationManager().authenticate(jwtAuthenticationToken);
    }

На стороне уравнения Angular я использую перехватчики HTTP для добавления токена JWT в каждый запрос отправлен. Вот как выглядит мой HttpInterceptorAuth.service.ts:

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    let jwtAuthHeader = this._authSvc.getAuthorizedToken();
    let jwtAuthUsername = this._authSvc.getLoggedInUsername();

    if (jwtAuthHeader && jwtAuthUsername) {
      request = request.clone({
        setHeaders: {
          Authorization: jwtAuthHeader
        }
      });
    }
    console.log(request);
    return next.handle(request);
  }

Поскольку я регистрирую запрос, отправленный перехватчиком HTTP, он выглядит так в консоли Chrome:

Modified request after HTTP interceptor intercepts and adds JWT Auth Token

На вкладке Сеть в Chrome Инструменты разработчика, это запрос, который отправляется Chrome: Actual request sent by Chrome

Обратите внимание, что запрос OPTIONS завершается неудачно с 401 Unauthorized.

Возможно, это связано с тем, что на внутренней стороне я получаю пустой заголовок авторизации, когда перехватчик HTTP обновил запрос с помощью токена JWT в заголовке авторизации.

Понятия не имею, почему фактически отправленный запрос отличается от запроса, обновляемого перехватчиком HTTP. Как я могу решить эту проблему?

1 Ответ

1 голос
/ 21 января 2020

Как мне тогда избежать проверки запроса предварительной проверки?

Нельзя отключить или отключить механизм запроса предварительной проверки для источников CORS.

Обмен ресурсами между источниками (CORS) - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузерам, чтобы веб-приложение, работающее в одном источнике, получало доступ к выбранным ресурсам из различного происхождения. Веб-приложение выполняет HTTP-запрос перекрестного источника, когда оно запрашивает ресурс, который имеет другой источник (домен, протокол или порт) из своего собственного

, чтобы разрешить использование CorsConfigurationSource или @CrossOrigin

@Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"));
        configuration.setAllowedHeaders(Arrays.asList("authorization", "content-type", "x-auth-token"));
        configuration.setExposedHeaders(Arrays.asList("x-auth-token"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

@CrossOrigin(origins = "*",allowCredentials = ,allowedHeaders = , exposedHeaders = , methods = , value = )

Access-Control-Expose-Headers

...