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


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:passwd@www.server.com/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...


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))))
  }
});

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
});

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.


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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.