J’ai essayé d’obtenir des données POST 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 configuration de mon 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="Ressortingcted"
Je suppose que la configuration du serveur est bonne car je peux accéder à l’API à partir du client Advanced REST (Chrome Extension)
Aucune suggestion?
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 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 OPTION
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 dans l’URL et le chiffrement
bien sûr, vous aurez besoin du mot de passe du nom d’utilisateur, ce n’est pas du 'Basic hashssortingng
.
J’espère que cela t’aides…
Pour 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 procéder à l’authentification de base avec un en-tête à la place. de mettre le nom d’utilisateur et mot de passe dans l’URL. Notez que cela ne cache toujours pas le nom d’utilisateur ou le mot de passe de toute personne ayant access 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)))) } });
Si vous souhaitez le faire avec NodeJS: créez un noeud final GET to JSON avec l’en-tête Authorization
et récupérez une Promise
:
Premier
npm install --save request request-promise
( voir sur npm ) puis dans votre fichier .js
:
var requestPromise = require('request-promise'); var user = 'user'; var password = 'password'; var base64encodedData = new Buffer(user + ':' + password).toSsortingng('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 });
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 ASCII encodée en Base64. Sa prise en charge par 97% des navigateurs .
Exemple:
> "Basic " + btoa("billy"+":"+"secretpassword") < "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="
Vous pouvez ensuite append Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=
à l'en-tête d' authorization
.
Notez que les mises en garde habituelles concernant HTTP BASIC auth s’appliquent, le plus important si vous n’envoyez pas votre trafic via https, un espion peut simplement décoder la chaîne codée Base64 et obtenir ainsi votre mot de passe.
Cette réponse security.stackexchange.com donne un bon aperçu de certains des inconvénients.
pas besoin d’utiliser utilisateur et mot de passe dans le cadre de l’URL
vous pouvez essayer ceci
byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes()); Ssortingng USER_PASS = new Ssortingng(encodedBytes); HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();