Я получаю нулевой заголовок авторизации, когда отправляю запрос на внутренний контроллер, разработанный с использованием 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:
На вкладке Сеть в Chrome Инструменты разработчика, это запрос, который отправляется Chrome:
Обратите внимание, что запрос OPTIONS
завершается неудачно с 401 Unauthorized
.
Возможно, это связано с тем, что на внутренней стороне я получаю пустой заголовок авторизации, когда перехватчик HTTP обновил запрос с помощью токена JWT в заголовке авторизации.
Понятия не имею, почему фактически отправленный запрос отличается от запроса, обновляемого перехватчиком HTTP. Как я могу решить эту проблему?