So senden Sie einen korrekten Autorisierungsheader für die Basisauthentifizierung

99

Ich versuche, Daten von meiner API zu POSTEN, kann jedoch die Basisauthentifizierung nicht bestehen.

Ich versuche:

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

Meine Antwort auf die Serverkonfiguration lautet:

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

Die Überschriften, die ich bekomme, sind:

Header anfordern

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

Antwortheader

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"

Ich denke, die Serverkonfiguration ist gut, da ich vom Advanced REST Client (Chrome Extension) auf die API zugreifen kann.

Irgendwelche Vorschläge?

PD: Der Header, den ich vom Advanced REST-Client erhalte, lautet:

    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

und

    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

OPTION-Methode senden

individuo7
quelle
19
Mir ist klar, dass dieser Beitrag schon lange tot ist, aber ich möchte nur darauf hinweisen, falls Sie nicht wissen, dass Sie durch das Veröffentlichen Ihres Authorization: -Headers Ihr Passwort im Wesentlichen im Klartext veröffentlicht haben. Die Kauderwelsch-Zeichenfolge dort ist nur die Base64-Codierung Ihres Benutzernamens: Passwort, damit jeder Ihr Passwort sehen kann. Hoffentlich haben Sie dies erkannt und hier ein Dummy-Passwort verwendet :)
Lexelby
Dies funktioniert gut mit ssrs report server 2017. Es verbirgt das Passwort und den Benutzernamen in der URL.
Clark Vera
@ Lexelby: Der Benutzername ist "der Benutzer" und das Passwort ist "und das Passwort" in Spanisch. Ich vermute also, dass dies keine echten Anmeldeinformationen sind.
pdr

Antworten:

48

Sie können den Benutzer und das Kennwort als Teil der URL angeben:

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

Weitere Informationen finden Sie unter dieser URL

Anmeldeinformationen für die HTTP-Basisauthentifizierung, die in URL und Verschlüsselung übergeben wurden

Natürlich benötigen Sie das Benutzername-Passwort, nicht 'Basic hashstring.

hoffe das hilft...

Dru
quelle
6
Diese Lösung funktioniert nicht für den nativen Browser von Android (Pre KitKat). Das Benutzername- / Anmeldeformular wird weiterhin für Ihren Benutzer angezeigt. Seien Sie also vorsichtig.
Sterling Bourne
58
Diese Methode stellt den Benutzernamen und das Passwort jedem zur Verfügung, der im Netzwerk oder auf Geräten zuhört ...
Adam
5
@ Adam Hash String ist auch nicht sicher
Mustafa
38
Dies beantwortet die Frage überhaupt nicht. Das Übergeben als URL ist kein Header.
jemiloii
5
Downvote-Grund: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . Gegen Ende des Artikels wird erwähnt, dassThe use of these URLs is deprecated
anurupr
70

Unter https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding und http://en.wikipedia.org/wiki/Basic_access_authentication erfahren Sie hier, wie Sie die Standardauthentifizierung stattdessen mit einem Header durchführen den Benutzernamen und das Passwort in die URL zu setzen. Beachten Sie, dass dadurch der Benutzername oder das Kennwort immer noch nicht vor Personen verborgen wird, die Zugriff auf das Netzwerk oder diesen JS-Code haben (z. B. einem Benutzer, der ihn in einem Browser ausführt):

$.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))))
  }
});
seanp2k
quelle
1
Hinweis: Damit diese Funktion in IE6,7,8,9 funktioniert, ist eine window.btoa-Polyfüllung wie Base64.js erforderlich. Auch unescape ist gemäß ECMAScript v3 veraltet.
null
@Techbrunch Sie irren sich, das Beispiel von seanp2k funktioniert sehr gut. Es verwendet einen sehr bekannten Trick, um Unicode-Zeichen in ASCII zu dekodieren. Es verwendet tatsächlich die Tatsache, dass (un) Escape Unicode nicht unterstützt, (dec) encodeURIComponent jedoch ..
40

Antwort von NodeJS:

Falls Sie dies mit NodeJS tun wollten: Erstellen Sie einen GET to JSON-Endpunkt mit AuthorizationHeader und erhalten Sie eine Rückmeldung Promise:

Zuerst

npm install --save request request-promise

( siehe auf npm ) und dann in Ihrer .jsDatei:

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
});
jakub.g
quelle
1
Danke, du hast meinen Tag gerettet :)
Sparw
Vielen Dank, dass dies in meiner Reaktionsanwendung funktioniert hat, die "fetch"
MohsenFM
13

Wenn Sie sich in einer Browserumgebung befinden, können Sie auch btoa verwenden .

btoaist eine Funktion, die eine Zeichenfolge als Argument verwendet und eine Base64-codierte ASCII-Zeichenfolge erzeugt. Es wird von 97% der Browser unterstützt .

Beispiel:

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

Sie können dann Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=zur authorizationKopfzeile hinzufügen .

Beachten Sie, dass die üblichen Einschränkungen bezüglich der HTTP-BASIC-Authentifizierung gelten. Vor allem, wenn Sie Ihren Datenverkehr nicht über https senden, kann ein Abhörgerät die Base64-codierte Zeichenfolge einfach dekodieren und so Ihr Kennwort erhalten.

Diese Antwort von security.stackexchange.com bietet einen guten Überblick über einige der Nachteile.

fernandohur
quelle
3

Benutzer und Passwort müssen nicht als Teil der URL verwendet werden

Sie können dies versuchen

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

String USER_PASS = new String(encodedBytes);

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