Заголовок авторизации отфильтрован CorsJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Заголовок авторизации отфильтрован Cors

Сообщение Anonymous »

Я использую Spring Security 6.3.1, и кажется, что Cors отфильтровывает мой заголовок авторизации. Я убедился, что запрос из моего веб-приложения содержит заголовок, но когда я пытаюсь получить его в своем JwtAuthorizationFilter, заголовок отфильтровывается. Вызов Postman работает по назначению.
Моя конфигурация WebSecurityConfiguration с глобальными настройками cors выглядит следующим образом:

Код: Выделить всё

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.requestMatchers(HttpMethod.POST, "/diagram/**").authenticated()
.requestMatchers(HttpMethod.PUT, "/diagram/**").authenticated()
.anyRequest().permitAll()).addFilterBefore(jwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}

@Bean
public JwtAuthorizationFilter jwtAuthorizationFilter() {
return new JwtAuthorizationFilter();
}

@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowedHeaders(List.of("*"));
corsConfiguration.setExposedHeaders(List.of("Authorization"));
corsConfiguration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
corsConfiguration.setAllowedHeaders(List.of("Authorization", "X-Refresh-Token", "Origin", "Content-Type", "Accept"));
corsConfiguration.setMaxAge(Duration.ofMinutes(10));
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(source);
}
}
А это мой jwtAuthorizationFilter()

Код: Выделить всё

@Component
public class JwtAuthorizationFilter extends OncePerRequestFilter {

@Autowired
private SupabaseAuthService supabaseAuthService;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

String tokenFromRequest = parseJwt(request);
//...
filterChain.doFilter(request, response);

}

private String parseJwt(HttpServletRequest request) {
String headerAuth = request.getHeader("Authorization");
if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) {
return headerAuth.substring(7);
}
return null;
}
}
Вызов API выглядит следующим образом:

Код: Выделить всё

const apiCall = async () => {
const response = await axios.post('http://localhost:8081/diagram/hello',{
headers: {
'Authorization': 'Bearer ...',
'Content-Type': 'application/json'
}})
};
Точка, в которой это не удается, - это когда я пытаюсь получить заголовок авторизации через фильтр. Когда звонок поступает через мое веб-приложение, он всегда равен нулю. Когда я делаю запрос через почтальона, токен на предъявителя присутствует.
Решение
Isse каким-то образом был связан с axios, когда я заменил axios на вызов fetch, это сработало.

Код: Выделить всё

const apiCall = async () => {
const response = await fetch('http://localhost:8081/diagram/hello',{
method: 'POST',
headers: {
'Authorization': 'Bearer ' + ...,
'Content-Type': 'application/json'
}
})
};
Этот репозиторий оказался полезным ресурсом для всех, кто создает что-то подобное:
https://github.com/hardikSinghBehl/jwt-auth -flow-spring-security

Подробнее здесь: https://stackoverflow.com/questions/787 ... ut-by-cors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»