web-dev-qa-db-fra.com

Comment envoyer Basic Auth avec axios

J'essaie 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 existe une option permettant de définir l'authentification de base; si je ne remplis pas ces champs, il renvoie également 401, mais si je le fais, la demande aboutit.

Des idées que je fais mal?

Voici une partie de la documentation de l'API expliquant comment implémenter ceci:

Ce service utilise les informations d'authentification de base dans l'en-tête pour établir une session d'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 renverra un JSESSIONID. Ce JSESSIONID peut être utilisé dans les demandes ultérieures pour passer des appels de service Web. *

34
Emmanuel

Il y a un paramètre "auth" pour Basic Auth:

auth: {
    username: 'janedoe',
    password: 's00pers3cret'
}

Source/Docs: https://github.com/mzabriskie/axios

46
luschn

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, et non dans la configuration, ce qui le placera dans les en-têtes. Selon les axios docs , l’alias de méthode request pour post est:

axios.post (url [ data [ config]])

Par conséquent, pour que votre code fonctionne, vous devez envoyer un objet vide pour les données:

var session_url = 'http://api_address/api/session_endpoint';
var username = 'user';
var password = 'password';
var basicAuth = 'Basic ' + btoa(username + ':' + password);
axios.post(session_url, {}, {
  headers: { 'Authorization': + basicAuth }
}).then(function(response) {
  console.log('Authenticated');
}).catch(function(error) {
  console.log('Error on Authentication');
});

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):

var session_url = 'http://api_address/api/session_endpoint';
var uname = 'user';
var pass = 'password';
axios.post(session_url, {}, {
  auth: {
    username: uname,
    password: pass
  }
}).then(function(response) {
  console.log('Authenticated');
}).catch(function(error) {
  console.log('Error on Authentication');
});
19
pillravi

Un exemple (axios_example.js) utilisant Axios dans Node.js:

const axios = require('axios');
const express = require('express');
const app = express();
const port = process.env.PORT || 5000;

app.get('/search', function(req, res) {
    let query = req.query.queryStr;
    let url = `https://your.service.org?query=${query}`;

    axios({
        method:'get',
        url,
        auth: {
            username: 'xxxxxxxxxxxxx',
            password: 'xxxxxxxxxxxxx'
        }
    })
    .then(function (response) {
        res.send(JSON.stringify(response.data));
    })
    .catch(function (error) {
        console.log(error);
    });
});

var server = app.listen(port);

Assurez-vous que dans votre répertoire de projet vous faites:

npm init
npm install express
npm install axios
node axios_example.js

Vous pouvez ensuite tester l'API Node.js REST à l'aide de votre navigateur à l'adresse: http://localhost:5000/search?queryStr=xxxxxxxxx

Réf.: https://github.com/axios/axios

0
Yuci