Jak wysłać poprawny nagłówek autoryzacji do podstawowego uwierzytelnienia

100

Próbuję POST dane z mojego API, ale nie mogę przejść podstawowego uwierzytelnienia.

Próbuję:

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

Odpowiedź mojej konfiguracji serwera to:

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

Nagłówki, które otrzymuję, to:

Nagłówki żądań

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

Nagłówek odpowiedzi

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"

Domyślam się, że konfiguracja serwera jest dobra, ponieważ mogę uzyskać dostęp do API z poziomu zaawansowanego klienta REST (rozszerzenie Chrome)

Jakieś sugestie?

PD: Nagłówek, który otrzymuję od klienta Advanced REST to:

    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

i

    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

wysyłanie OPCJA

indywiduo7
źródło
19
Zdaję sobie sprawę, że ten post jest dawno martwy, ale chcę tylko zwrócić uwagę na wypadek, gdybyś nie był świadomy, że publikując swój nagłówek Authorization :, zasadniczo umieściłeś swoje hasło w czystym miejscu. Ciąg bełkotu to tylko kodowanie base64 twojej nazwy użytkownika: hasło, więc każdy może zobaczyć twoje hasło. Mam nadzieję, że zdałeś sobie z tego sprawę i użyłeś tutaj fałszywego hasła :)
Lexelby
Działa to dobrze z serwerem raportów ssrs 2017. Ukrywa hasło i nazwę użytkownika w adresie URL.
Clark Vera
@Lexelby: nazwa użytkownika to „użytkownik”, a hasło to „a hasło” w języku hiszpańskim. Więc zgaduję, że to nie są prawdziwe referencje.
pdr

Odpowiedzi:

49

Możesz dołączyć użytkownika i hasło jako część adresu URL:

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

więcej informacji pod tym adresem URL

Poświadczenia uwierzytelnienia podstawowego HTTP przekazane w adresie URL i szyfrowanie

oczywiście będziesz potrzebować hasła do nazwy użytkownika, nie jest 'Basic hashstring.

mam nadzieję że to pomoże...

Dru
źródło
6
To rozwiązanie nie będzie działać dla natywnej przeglądarki Androida (Pre KitKat). Nazwa użytkownika / formularz logowania nadal będzie się pojawiać dla Twojego użytkownika, więc bądź ostrożny.
Sterling Bourne
58
Ta metoda ujawnia nazwę użytkownika i hasło każdemu, kto nasłuchuje w sieci lub na urządzeniach ...
Adam
5
@Adam również nie jest bezpieczny
Mustafa
38
To wcale nie odpowiada na pytanie. Przekazywanie go jako adresu URL nie jest nagłówkiem.
jemiloii
5
powód odrzucenia: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . Pod koniec artykułu wspomina się o tymThe use of these URLs is deprecated
anurupr
70

Na https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding i http://en.wikipedia.org/wiki/Basic_access_authentication , oto jak wykonać podstawowe uwierzytelnianie z nagłówkiem umieszczenia nazwy użytkownika i hasła w adresie URL. Zwróć uwagę, że to nadal nie powoduje ukrycia nazwy użytkownika ani hasła przed nikim, kto ma dostęp do sieci lub ten kod JS (np. Użytkownik wykonujący to w przeglądarce):

$.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
źródło
1
Uwaga: Aby ta funkcja działała w IE6,7,8,9, wymagany będzie wypełniacz window.btoa, taki jak Base64.js. Ponadto unescape jest przestarzały, zgodnie z ECMAScript v3.
null
@Techbrunch mylisz się, przykład seanp2k działa bardzo dobrze, używa bardzo znanej sztuczki do dekodowania znaków Unicode do ASCII, w rzeczywistości wykorzystuje fakt, że (nie) escape nie obsługuje Unicode, ale (dec) encodeURIComponent tak.
41

Odpowiedź NodeJS:

W przypadku, gdybyś chciał to zrobić z NodeJS: utwórz punkt końcowy GET do JSON z Authorizationnagłówkiem i otrzymaj z Promisepowrotem:

Pierwszy

npm install --save request request-promise

( zobacz na npm ), a następnie w swoim .jspliku:

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
});
jakub.g
źródło
1
Dzięki, uratowałeś mi dzień :)
Sparw
Dziękuję, że zadziałało w mojej aplikacji
React,
13

Jeśli jesteś w środowisku przeglądarki, możesz również użyć btoa .

btoajest funkcją, która przyjmuje łańcuch jako argument i tworzy łańcuch ASCII zakodowany w standardzie Base64. Jest obsługiwany przez 97% przeglądarek .

Przykład:

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

Następnie możesz dodać Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=do authorizationnagłówka.

Zauważ, że mają zastosowanie zwykłe zastrzeżenia dotyczące autoryzacji HTTP BASIC, co najważniejsze, jeśli nie wysyłasz swojego ruchu przez https, podsłuchiwany może po prostu zdekodować zakodowany ciąg Base64, uzyskując w ten sposób twoje hasło.

Ta odpowiedź na security.stackexchange.com daje dobry przegląd niektórych wad.

fernandohur
źródło
3

nie ma potrzeby używania użytkownika i hasła jako części adresu URL

możesz tego spróbować

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

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
erhanck
źródło