Estoy intentando implementar el siguiente código, pero algo no funciona. Aquí está el código:
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');
});
Devuelve un error 401. Cuando lo hago con Postman hay una opción para configurar la autenticación básica; si no completo esos campos, también devuelve 401, pero si lo hago, la solicitud es exitosa.
¿Alguna idea de lo que estoy haciendo mal?
Aquí hay parte de los documentos de la API sobre cómo implementar esto:
Este servicio utiliza información de autenticación básica en el encabezado para establecer una sesión de usuario. Las credenciales se validan con el servidor. El uso de este servicio web creará una sesión con las credenciales de usuario pasadas y devolverá un JSESSIONID. Este JSESSIONID se puede utilizar en las solicitudes posteriores para realizar llamadas al servicio web. *
La razón por la que el código en su pregunta no se autentica es porque está enviando la autenticación en el objeto de datos, no en la configuración, que lo colocará en los encabezados. Por los documentos Axios , el alias método de petición para
post
es:Por lo tanto, para que su código funcione, debe enviar un objeto vacío para los datos:
Lo mismo es cierto para el uso del parámetro auth mencionado por @luschn. El siguiente código es equivalente, pero usa el parámetro auth en su lugar (y también pasa un objeto de datos vacío):
fuente
Por algunas razones, este simple problema está bloqueando a muchos desarrolladores. Luché durante muchas horas con esta simple cosa. Este problema tantas dimensiones:
CORS
Mi configuración para el desarrollo es con una aplicación de paquete web vuejs que se ejecuta en localhost: 8081 y una aplicación de arranque de primavera que se ejecuta en localhost: 8080. Entonces, cuando intento llamar a la API de descanso desde el frontend, no hay forma de que el navegador me permita recibir una respuesta del backend de primavera sin la configuración CORS adecuada. CORS se puede utilizar para relajar la protección Cross Domain Script (XSS) que tienen los navegadores modernos. Según tengo entendido, los navegadores protegen su SPA de un ataque de un XSS. Por supuesto, algunas respuestas en StackOverflow sugirieron agregar un complemento de Chrome para deshabilitar la protección XSS, pero esto realmente funciona Y si lo fuera, solo empujaría el problema inevitable para más adelante.
Configuración de backend CORS
Así es como debe configurar CORS en su aplicación de arranque de primavera:
Agregue una clase CorsFilter para agregar encabezados adecuados en la respuesta a una solicitud de cliente. Access-Control-Allow-Origin y Access-Control-Allow-Headers son lo más importante para la autenticación básica.
Agregue una clase de configuración que amplíe Spring WebSecurityConfigurationAdapter. En esta clase inyectarás tu filtro CORS:
No tiene que poner nada relacionado con CORS en su controlador.
Interfaz
Ahora, en la interfaz, debe crear su consulta axios con el encabezado Autorización:
Espero que esto ayude.
fuente
Un ejemplo (axios_example.js) usando Axios en Node.js:
Asegúrese de que en el directorio de su proyecto lo haga:
Luego puede probar la API REST de Node.js usando su navegador en:
http://localhost:5000/search?queryStr=xxxxxxxxx
Ref: https://github.com/axios/axios
fuente
La solución dada por luschn y pillravi funciona bien a menos que reciba un Strict-Transport-Security encabezado en la respuesta.
Agregar withCredentials: true resolverá ese problema.
fuente