Jak poprawnie zdefiniować podstawowe uwierzytelnianie HTTP przy użyciu cURL?

161

Uczę się Apigility ( dokument Apigility -> Samouczek usługi REST ) i próbuję wysłać żądanie POST z podstawowym uwierzytelnieniem przez cURL:

$ curl -X POST -i -H "Content-Type: application/hal+json" -H "Authorization: Basic YXBpdXNlcjphcGlwd2Q=" http://apigilityhw.sandbox.loc/status

YXBpdXNlcjphcGlwd2Q=jest ciągiem zakodowanym w bazie 64 z moimi poświadczeniami apiuser:apipwd. Poświadczenia są zapisywane w /data/htpasswd( apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/).

Wygląda to następująco:

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.7
Date: Mon, 22 Sep 2014 07:48:47 GMT
Content-Type: application/problem+json
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.5.12-1~dotdeb.1
WWW-Authenticate: Basic realm="api"

Gdzie jest błąd? Jak to działa?

automatix
źródło

Odpowiedzi:

291
curl -u username:password http://
curl -u username http://

Ze strony dokumentacji:

-u, --user <użytkownik: hasło>

Określ nazwę użytkownika i hasło używane do uwierzytelniania serwera. Zastępuje -n, --netrc i --netrc-optional.

Jeśli po prostu określisz nazwę użytkownika, program curl poprosi o podanie hasła.

Nazwa użytkownika i hasło są podzielone na pierwszy dwukropek, co uniemożliwia użycie dwukropka w nazwie użytkownika z tą opcją. Hasło nadal może.

Korzystając z protokołu Kerberos V5 z serwerem opartym na systemie Windows, należy dołączyć nazwę domeny Windows do nazwy użytkownika, aby serwer mógł pomyślnie uzyskać bilet protokołu Kerberos. Jeśli tego nie zrobisz, wstępne uzgadnianie uwierzytelniania może się nie powieść.

W przypadku korzystania z NTLM nazwę użytkownika można określić po prostu jako nazwę użytkownika, bez domeny, na przykład, jeśli w konfiguracji istnieje jedna domena i las.

Aby określić nazwę domeny, użyj formatu nazwy logowania niższego poziomu lub UPN (główna nazwa użytkownika). Na przykład odpowiednio EXAMPLE \ user i [email protected].

Jeśli używasz pliku binarnego curl z obsługą SSPI systemu Windows i przeprowadzasz uwierzytelnianie Kerberos V5, Negotiate, NTLM lub Digest, możesz poinstruować curl, aby wybrał nazwę użytkownika i hasło z Twojego środowiska, określając pojedynczy dwukropek z tą opcją: „-u:” .

Jeśli ta opcja zostanie użyta kilka razy, zostanie użyta ostatnia.

http://curl.haxx.se/docs/manpage.html#-u

Zauważ, że nie potrzebujesz --basicflagi, ponieważ jest ona domyślna.

Gajus
źródło
14
Jeśli Twoje hasło zawiera znaki specjalne, takie jak? lub @ to musisz umieścić to w pojedynczych tikach. curl -u 'nazwa użytkownika:? p @ ssword' http: //
Mirko Ebert
2
ale jak wygląda ta rzeczywista prośba? Wydaje mi się, że wiele osób testuje za pomocą curl, ale potem pisze kod w dowolnym języku, którego używają. czy informacja --user jest wysyłana jako nagłówek? Jeśli tak, jak powinien wyglądać ten nagłówek
Verty00
@GautamKathrotiya w Postman jest opcja Basic Auth w zakładce Authorization żądania, wstawi ona ten nagłówek Authorization za Ciebie.
Kyle Calica-St
1
@ Verty00 możesz użyć flagi -v z curl, aby zobaczyć zawartość żądania.
Zach,
17

jako nagłówek

AUTH=$(echo -ne "$BASIC_AUTH_USER:$BASIC_AUTH_PASSWORD" | base64 --wrap 0)

curl \
  --header "Content-Type: application/json" \
  --header "Authorization: Basic $AUTH" \
  --request POST \
  --data  '{"key1":"value1", "key2":"value2"}' \
  https://example.com/
srghma
źródło