React + Spring Boot: не удается получить значение авторизации из заголовка - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать приложение React, которое использует приложение Spring Boot в качестве бэкэнда. Пользователь получает Json веб-токен, когда его операция входа в систему успешна, в параметре заголовка, называемом «Авторизация»:

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
        Authentication authResult) throws IOException, ServletException {

    String login = ((UserSS) authResult.getPrincipal()).getUsername();
    String token = jwtUtil.generateToken(login);
    response.addHeader("Authorization", "Bearer " + token);
}

Я использовал Insomnia для тестирования конечной точки, и, похоже, он работает, потому что токен был получен как и ожидалось:

Insomnia POST request to login endpoint

Проблема в том, что при использовании React и Ax ios значение заголовка не найдено:

const [login, setLogin] = useState('');
const [password, setpassword] = useState('');

async function handleLogin(e) {
    e.preventDefault();

    const response = await Api.post('/login', {
        login, senha: password
    });

    console.log(response.headers);
    if(response.headers['authorization']){
        history.push("/menu");
    }
}

console.log(request.headers) result

Даже если он внутри XHR, но я не могу его получить:

Authorization header value inside XHR

Моя конфигурация CORS:

@Bean
CorsConfigurationSource corsConfigurationSource() {

    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    source.registerCorsConfiguration("/**", config.applyPermitDefaultValues());

    return source;
}

Есть идеи, что это может быть?

1 Ответ

0 голосов
/ 28 февраля 2020

Источником проблемы было то, что мне нужно было указать CORS выставить заголовок:

@Bean
CorsConfigurationSource corsConfigurationSource() {

    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    source.registerCorsConfiguration("/**", config.applyPermitDefaultValues());
    //allow Authorization to be exposed
    config.setExposedHeaders(Arrays.asList("Authorization"));

    return source;
}

В моем интерфейсе 'Авторизация' извлекается в нижнем регистре 'Авторизация'.

...