J'essaye d'implémenter le code suivant, mais quelque chose ne fonctionne pas. Voici le code:
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');
});
Il renvoie une erreur 401. Lorsque je le fais avec Postman, il y a une option pour définir l'authentification de base; si je ne remplis pas ces champs, il renvoie également 401, mais si je le fais, la demande est réussie.
Des idées sur ce que je fais mal?
Voici une partie de la documentation de l'API sur la façon de l'implémenter:
Ce service utilise les informations d'authentification de base dans l'en-tête pour établir une session utilisateur. Les informations d'identification sont validées par rapport au serveur. L'utilisation de ce service Web créera une session avec les informations d'identification de l'utilisateur transmises et retournera un JSESSIONID. Ce JSESSIONID peut être utilisé dans les demandes suivantes pour effectuer des appels de service Web. *
La raison pour laquelle le code de votre question ne s'authentifie pas est que vous envoyez l'authentification dans l'objet de données, pas dans la configuration, ce qui la mettra dans les en-têtes. Selon la documentation axios , l' alias de la méthode de requête pour
post
est:Par conséquent, pour que votre code fonctionne, vous devez envoyer un objet vide pour les données:
Il en va de même pour l'utilisation du paramètre auth mentionné par @luschn. Le code suivant est équivalent, mais utilise le paramètre auth à la place (et transmet également un objet de données vide):
la source
Pour certaines raisons, ce simple problème bloque de nombreux développeurs. J'ai lutté pendant de nombreuses heures avec cette chose simple. Ce problème autant de dimensions:
CORS
Ma configuration pour le développement est avec une application webpack vuejs s'exécutant sur localhost: 8081 et une application de démarrage de printemps s'exécutant sur localhost: 8080. Ainsi, lorsque vous essayez d'appeler l'API rest depuis le frontend, il n'y a aucun moyen que le navigateur me permette de recevoir une réponse du backend Spring sans les paramètres CORS appropriés. CORS peut être utilisé pour assouplir la protection XSS (Cross Domain Script) offerte par les navigateurs modernes. Si je comprends bien, les navigateurs protègent votre SPA contre une attaque par un XSS. Bien sûr, certaines réponses sur StackOverflow suggéraient d'ajouter un plugin chrome pour désactiver la protection XSS, mais cela fonctionne vraiment ET si c'était le cas, cela ne ferait que pousser l'inévitable problème pour plus tard.
Configuration du backend CORS
Voici comment configurer CORS dans votre application Spring Boot:
Ajoutez une classe CorsFilter pour ajouter les en-têtes appropriés dans la réponse à une demande client. Access-Control-Allow-Origin et Access-Control-Allow-Headers sont la chose la plus importante à avoir pour l'authentification de base.
Ajoutez une classe de configuration qui étend Spring WebSecurityConfigurationAdapter. Dans cette classe, vous injecterez votre filtre CORS:
Vous n'avez rien à mettre en rapport avec CORS dans votre contrôleur.
L'extrémité avant
Maintenant, dans le frontend, vous devez créer votre requête axios avec l'en-tête Authorization:
J'espère que cela t'aides.
la source
Un exemple (axios_example.js) utilisant Axios dans Node.js:
Assurez-vous que dans le répertoire de votre projet vous faites:
Vous pouvez ensuite tester l'API REST Node.js à l'aide de votre navigateur à l'adresse:
http://localhost:5000/search?queryStr=xxxxxxxxx
Réf: https://github.com/axios/axios
la source
La solution donnée par luschn et pillravi fonctionne bien sauf si vous recevez un en - tête Strict-Transport-Security dans la réponse.
L'ajout de withCredentials: true résoudra ce problème.
la source