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
Vous pouvez inclure l'utilisateur et le mot de passe dans l'URL:
http://user:[email protected]/index.html
voir cette URL, pour plus
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...
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))))
}
});
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
});
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.
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();