web-dev-qa-db-fra.com

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

J'essaie de POST données de mon API, mais je ne peux 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 ZWx1c3VhcmlvOnlsYWNsYXZl');
  }
});

La réponse de ma configuration de serveur est la suivante:

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 je reçois 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 du Advanced REST Client (extension de chrome).

Aucune suggestion?

PD: L'en-tête que je reçois du client avancé 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 ZWx1c3VhcmlvOnlsYWNsYXZl
    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

et

    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 d'OPTION

89
individuo7

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

http://user:[email protected]/index.html

voir cette URL, pour plus

informations d'identification d'authentification de base HTTP transmises sous forme d'URL et de chiffrement

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

j'espère que cela t'aides...

45
Dru

Per https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding et http://en.wikipedia.org/wiki/Basic_access_authentication , 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 masque toujours pas le nom d'utilisateur ou le mot de passe de quiconque ayant accès au réseau ou de 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))))
  }
});
65
seanp2k

NodeJS répond:

Si vous voulez le faire avec NodeJS: créez un noeud final GET to JSON avec l'en-tête Authorization et récupérez un Promise:

Première

npm install --save request request-promise

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

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

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

var base64encodedData = new Buffer(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
});
31
jakub.g

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

btoa est une fonction qui prend une chaîne en argument et produit une chaîne codée en Base64 ASCII. Son supporté par 97% des navigateurs .

Exemple:

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

Vous pouvez ensuite ajouter Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ= à l'en-tête authorization.

Notez que les mises en garde habituelles à propos de l'authentification HTTP BASIC s'appliquent. Surtout, si vous n'envoyez pas votre trafic via https, une écoute indiscrète peut simplement décoder la chaîne codée en Base64 et obtenir ainsi votre mot de passe.

Cette réponse security.stackexchange.com donne un bon aperçu de certains inconvénients.

6
fernandohur

pas besoin d'utiliser utilisateur et mot de passe dans le cadre de l'URL

tu peux essayer ça

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

String USER_PASS = new String(encodedBytes);

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