Я пытаюсь реализовать следующий код, но что-то не работает. Вот код:
var session_url = 'http://api_address/api/session_endpoint';
var username = 'user';
var password = 'password';
var credentials = btoa(username + ':' + password);
var basicAuth = 'Basic ' + credentials;
axios.post(session_url, {
headers: { 'Authorization': + basicAuth }
}).then(function(response) {
console.log('Authenticated');
}).catch(function(error) {
console.log('Error on Authentication');
});
Он возвращает ошибку 401. Когда я делаю это с помощью Postman, есть возможность установить базовую аутентификацию; если я не заполню эти поля, он также вернет 401, но если я это сделаю, запрос будет успешным.
Есть идеи, что я делаю не так?
Вот часть документации API о том, как это реализовать:
Эта служба использует информацию базовой аутентификации в заголовке для установления сеанса пользователя. Учетные данные проверяются на сервере. Использование этой веб-службы создаст сеанс с переданными учетными данными пользователя и вернет JSESSIONID. Этот JSESSIONID можно использовать в последующих запросах для вызовов веб-службы. *
Причина, по которой код в вашем вопросе не аутентифицируется, заключается в том, что вы отправляете аутентификацию в объекте данных, а не в конфигурации, которая помещает его в заголовки. Согласно документации axios , псевдоним метода запроса для
post
:Следовательно, чтобы ваш код работал, вам нужно отправить пустой объект для данных:
То же самое верно и для использования параметра auth, упомянутого @luschn. Следующий код эквивалентен, но вместо него использует параметр auth (а также передает пустой объект данных):
источник
По некоторым причинам эта простая проблема блокирует многих разработчиков. Я много часов боролся с этой простой вещью. Эта проблема как многогранная:
CORS
Моя установка для разработки - это приложение vuejs webpack, работающее на localhost: 8081, и приложение весенней загрузки, работающее на localhost: 8080. Таким образом, при попытке вызвать rest API из внешнего интерфейса браузер не позволит мне получить ответ от весеннего внутреннего интерфейса без правильных настроек CORS. CORS можно использовать для ослабления защиты Cross Domain Script (XSS), которая есть в современных браузерах. Насколько я понимаю, браузеры защищают ваш SPA от атаки XSS. Конечно, в некоторых ответах на StackOverflow предлагалось добавить плагин chrome для отключения защиты XSS, но это действительно работает, И если бы это было так, это только подтолкнуло бы неизбежную проблему на потом.
Конфигурация Backend CORS
Вот как следует настроить CORS в приложении для весенней загрузки:
Добавьте класс CorsFilter, чтобы добавить правильные заголовки в ответ на запрос клиента. Access-Control-Allow-Origin и Access-Control-Allow-Headers - самые важные вещи, которые нужно иметь для базовой аутентификации.
Добавьте класс конфигурации, который расширяет Spring WebSecurityConfigurationAdapter. В этом классе вы вставите свой фильтр CORS:
Вам не нужно помещать в контроллер ничего, связанное с CORS.
Внешний интерфейс
Теперь во фронтенде вам нужно создать свой запрос axios с заголовком авторизации:
Надеюсь это поможет.
источник
Пример (axios_example.js) с использованием Axios в Node.js:
Убедитесь, что в каталоге вашего проекта вы делаете:
Затем вы можете протестировать REST API Node.js в своем браузере по адресу:
http://localhost:5000/search?queryStr=xxxxxxxxx
Ссылка: https://github.com/axios/axios
источник
Решение, предоставленное luschn и pillravi, отлично работает, если вы не получите в ответе заголовок Strict-Transport-Security .
Добавление withCredentials: true решит эту проблему.
источник
Если вы пытаетесь выполнить базовую аутентификацию, вы можете попробовать следующее:
Это сработало для меня. надеюсь, это поможет
источник