Jak ustawić nagłówek autoryzacji za pomocą curl

397

Jak przekazać nagłówek autoryzacji za pomocą cURL? (wykonywalny w /usr/bin/curl).

Widja
źródło

Odpowiedzi:

394

http://curl.haxx.se/docs/httpscripting.html

Patrz część 6. Uwierzytelnianie HTTP

Uwierzytelnianie HTTP

Uwierzytelnianie HTTP to możliwość podania serwerowi nazwy użytkownika i hasła, aby mógł zweryfikować, czy masz możliwość wykonania żądanego żądania. Podstawowe uwierzytelnianie używane w HTTP (domyślnie jest to typ curl) jest oparte na zwykłym tekście , co oznacza, że ​​wysyła nazwę użytkownika i hasło tylko nieznacznie zaciemnione, ale nadal w pełni czytelne dla każdego, kto wącha sieć między tobą a serwerem zdalnym.

Aby powiedzieć curlowi, aby używał użytkownika i hasła do uwierzytelnienia:

curl --user name:password http://www.example.com

Witryna może wymagać innej metody uwierzytelniania (sprawdź nagłówki zwrócone przez serwer), a następnie --ntlm, --digest, --negotiate lub nawet - dowolne opcje mogą być odpowiednie dla Ciebie.

Czasami dostęp do HTTP jest dostępny tylko za pośrednictwem serwera proxy HTTP. Wydaje się to szczególnie powszechne w różnych firmach. Serwer proxy HTTP może wymagać własnego użytkownika i hasła, aby umożliwić klientowi dostęp do Internetu. Aby określić te z zawijaniem, uruchom coś takiego:

curl --proxy-user proxyuser:proxypassword curl.haxx.se

Jeśli twój serwer proxy wymaga uwierzytelnienia przy użyciu metody NTLM, użyj --proxy-ntlm, jeśli wymaga użycia Digest --proxy-digest.

Jeśli użyjesz jednej z tych opcji + hasło użytkownika, ale pominiesz część hasła, curl poprosi o hasło interaktywnie.

Należy pamiętać, że po uruchomieniu programu jego parametry mogą być widoczne podczas wyświetlania listy uruchomionych procesów systemu. Dlatego inni użytkownicy mogą oglądać Twoje hasła, jeśli podasz je jako zwykłe opcje wiersza poleceń. Istnieją sposoby na obejście tego.

Warto zauważyć, że chociaż w ten sposób działa uwierzytelnianie HTTP, bardzo wiele stron internetowych nie będzie używać tej koncepcji, gdy zapewniają loginy itp. Więcej informacji na ten temat znajduje się w rozdziale Logowanie do Internetu.

Oli
źródło
16
@Vixed To pytanie wyraźnie nie dotyczy PHP. [Co jest nie tak z wynikami Google]?
Oli
Pytanie dotyczy autoryzacji, a nie uwierzytelnienia, więc może OP powinien zmienić tytuł pytania
zacięcie
320

Po prostu dodajesz, abyś nie musiał klikać:

curl --user name:password http://www.example.com

lub jeśli próbujesz wykonać uwierzytelnianie wysyłania dla OAuth 2:

curl -H "Authorization: OAuth <ACCESS_TOKEN>" http://www.example.com
Tony
źródło
15
Wiele interfejsów API używa teraz tokenów autoryzacji nagłówków. -HOpcja jest wielki.
eliocs,
14
Jeśli użyjesz opcji -u lub --user, Curl zakoduje poświadczenia w Base64 i utworzy nagłówek w następujący sposób: -H Authorization: Basic <Base64EncodedCredentials>
Timothy Kanski,
Próbuję dodać nagłówek autoryzacji, w którym HMAC-SHA256zawsze pojawia się błąd braku nagłówka autoryzacji
Steven Aguilar,
2
Dodatkowo, jeśli potrzebne <Base64EncodedCredentials>, jak wspomniano przez @ tymotki-kansaki można uzyskać poświadczeń kodowane za pomocą polecenia: cred="$( echo $NAME:$PASSWORD | base64 )"; curl -H "Authorization: Basic $cred" https://example.com. W celach informacyjnych patrz stackoverflow.com/questions/16918602/…
celach David Golembiowski,
170

Tokeny na okaziciela wyglądają tak:

curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://www.example.com
Steve Tauber
źródło
7
A jeśli chcesz dokonać autoryzacji „Basic”, po prostu zamień „Bearer” na „Basic”
darren
Mam najdziwniejszą rzecz: dostaję „Niewłaściwy format nagłówka autoryzacji” i „HTTP-200”. Czy serwer akceptuje moją autoryzację, ale format jest nieprawidłowy?
Groostav
64

(dla tych, którzy szukają odpowiedzi php-curl )

$service_url = 'https://example.com/something/something.json';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password"); //Your credentials goes here
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //IMP if the url has https and you don't want to verify source certificate

$curl_response = curl_exec($curl);
$response = json_decode($curl_response);
curl_close($curl);

var_dump($response);
Rao
źródło
64

To działało dla mnie:

 curl -H "Authorization: Token xxxxxxxxxxxxxx" https://www.example.com/
timj98
źródło
Czego używasz do JWT?
Ciasto piekarz
1
Nie masz na myśli Authorization: bearer xxxxxxxxx?
jlh
@ jlh masz na myśliBearer
Daniel W.
Byłem prawie pewien, że nie uwzględnia wielkości liter, ale wygląda na to, że się mylę. Tak, miałem na myśli Bearer.
jlh
20

W przypadku uwierzytelniania podstawowego HTTP:

curl -H "Authorization: Basic <_your_token_>" http://www.example.com

zamień _your_token_i adres URL.

Devaroop
źródło
Kiedy używasz oauth, skąd pochodzi token autoryzacji? Próbuję użyć curl, aby pobrać pliki ze strony, na której używam użytkownika i hasła, ale wydaje się, że zawodzi z powodu oauth2 w użyciu.
ctrl-alt-delete
@toasteez musisz przejść przez przepływ Oauth2, aby otrzymać token. Zazwyczaj jest to proces dwuetapowy i powinien być szczegółowo opisany w dokumentacji serwera.
Devaroop,
13
dobra odpowiedź. mały pomocnik echo -ne "<your-user>:<your-pass>" | base64 --wrap 0wygeneruje podstawowy token uwierzytelnienia.
Mike D,
3
@MikeD -H "Authorization: Basic <_your_token_>"działa tak samo jak --user login:password. Możesz to sprawdzić za pomocącurl -v
vladkras
1
@vladkras moja odpowiedź jest pomocnikiem dla tej odpowiedzi. z mojego doświadczenia wynika, że ​​lepiej jest zrozumieć, jak utworzyć token zamiast polegać na curl, aby go wygenerować.
Mike D
14

Uważaj, aby podczas korzystania z: curl -H "Authorization: token_str" http://www.example.com

token_stri Authorizationmuszą być oddzielone spacją, w przeciwnym razie po stronie serwera nie można uzyskać HTTP_AUTHORIZATIONśrodowiska.

jianpx
źródło
2
Nieprawda, jeśli wymagana jest biała spacja, serwer HTTP jest uszkodzony. Potrzebujesz także dwóch łańcuchów typu, a następnie tokena.
Alexis Wilke
5

Jeśli nie masz tokena w momencie wykonywania połączenia, będziesz musiał wykonać dwa połączenia, jedno, aby uzyskać token, a drugie, aby wyodrębnić token z odpowiedzi, zwróć uwagę na

token grep | cut -d, -f1 | cut -d \ "-f4

ponieważ jest to część zajmująca się wydobywaniem tokena z odpowiedzi.

echo "Getting token response and extracting token"    
def token = sh (returnStdout: true, script: """
    curl -S -i -k -X POST https://www.example.com/getToken -H \"Content-Type: application/json\" -H \"Accept: application/json\" -d @requestFile.json | grep token | cut -d, -f1 | cut -d\\" -f4
""").split()

Po wyodrębnieniu tokena można go używać do wykonywania kolejnych połączeń w następujący sposób.

echo "Token : ${token[-1]}"       
echo "Making calls using token..."       
curl -S -i -k  -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${token[-1]}" https://www.example.com/api/resources 
Upul Doluweera
źródło