135 votes

Comment envoyer un en-tête d'autorisation correct pour l'authentification de base ?

J'essaie d'envoyer des données à partir de mon API mais je ne parviens pas à passer l'authentification de base.

J'essaie :

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic [REDACTED]');
  }
});

La réponse de ma configuration de serveur est :

response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"

Les en-têtes que j'obtiens sont :

En-têtes de demande

OPTIONS /api/v1/token-auth/ HTTP/1.1
Host: theappurl.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
Access-Control-Request-Headers: origin, authorization, content-type
Accept: */*
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

En-tête de réponse

HTTP/1.1 401 Unauthorized
Server: nginx/1.1.19
Date: Fri, 16 Aug 2013 01:29:21 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"

Je suppose que la configuration du serveur est bonne, car je peux accéder à l'API à partir de l'interface utilisateur. Client REST avancé (Extension Chrome)

Des suggestions ?

PD : L'en-tête que je reçois du client Advanced REST est :

    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
    Authorization: Basic [REDACTED]
    Content-Type: application/x-www-form-urlencoded 
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: es,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

y

    Server: nginx/1.1.19 
    Date: Fri, 16 Aug 2013 01:07:18 GMT 
    Content-Type: application/json; charset=utf-8 
    Transfer-Encoding: chunked 
    Connection: keep-alive
    Vary: Accept, Cookie 
    Allow: POST, OPTIONS 
    X-Robots-Tag: noindex

méthode d'envoi OPTION

84voto

seanp2k Points 138

Par https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding y http://en.wikipedia.org/wiki/Basic_access_authentication Si vous avez besoin d'un nom d'utilisateur et d'un mot de passe, voici comment faire une authentification de base avec un en-tête au lieu de mettre le nom d'utilisateur et le mot de passe dans l'URL. Notez que cela ne cache toujours pas le nom d'utilisateur ou le mot de passe à toute personne ayant accès au réseau ou à ce code JS (par exemple, un utilisateur l'exécutant dans un navigateur) :

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
  }
});

62voto

jakub.g Points 3734

Réponse NodeJS :

Si vous voulez le faire avec NodeJS : créez un point d'accès GET à JSON avec Authorization et obtenir un Promise arrière :

Premier

npm install --save request request-promise

( voir sur npm ) et ensuite dans votre .js fichier :

var requestPromise = require('request-promise');

var user = 'user';
var password = 'password';

var base64encodedData = Buffer.from(user + ':' + password).toString('base64');

requestPromise.get({
  uri: 'https://example.org/whatever',
  headers: {
    'Authorization': 'Basic ' + base64encodedData
  },
  json: true
})
.then(function ok(jsonData) {
  console.dir(jsonData);
})
.catch(function fail(error) {
  // handle error
});

61voto

Dru Points 566

Vous pouvez inclure l'utilisateur et le mot de passe dans l'URL :

http://user:passwd@www.server.com/index.html

voir cette URL, pour en savoir plus

Authentification HTTP de base : informations d'identification transmises dans l'URL et cryptage.

Bien sûr, vous aurez besoin du nom d'utilisateur et du mot de passe, ce n'est pas 'Basic hashstring .

J'espère que cela vous aidera...

17voto

fernandohur Points 899

Si vous êtes dans un environnement de navigateur, vous pouvez également utiliser btoa .

btoa est une fonction qui prend une chaîne de caractères comme argument et produit une chaîne ASCII encodée en Base64. Elle est supportée par 97% des navigateurs .

Ejemplo:

> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="

Vous pouvez alors ajouter Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ= à la authorization en-tête.

Notez que les avertissements habituels concernant l'authentification HTTP BASIC s'appliquent, le plus important étant que si vous n'envoyez pas votre trafic via https, une personne écoutée peut simplement décoder la chaîne encodée en Base64 et obtenir ainsi votre mot de passe.

Ce security.stackexchange.com donne un bon aperçu de certains de ses inconvénients.

3voto

erhanck Points 67

Pas besoin d'utiliser l'utilisateur et le mot de passe comme partie de l'URL

vous pouvez essayer ceci

byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes());

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X