398 Stimmen

Wie definiert man die grundlegende HTTP-Authentifizierung mit cURL richtig?

Ich lerne Apigility (Apigility-Doku -> REST-Service-Tutorial) und versuche, eine POST-Anfrage mit Basic-Authentifizierung über cURL zu senden:

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

YXBpdXNlcjphcGlwd2Q= ist der Base64-codierte String mit meinen Anmeldeinformationen apiuser:apipwd. Die Anmeldeinformationen sind im /data/htpasswd gespeichert (apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/).

Das Ergebnis sieht so aus:

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"

Wo liegt hier der Fehler? Wie kann man es zum Laufen bringen?

676voto

Gajus Punkte 61796
curl -u Benutzername:Passwort http://
curl -u Benutzername http://

Von der Dokumentationsseite:

-u, --user

Gibt den Benutzernamen und das Passwort für die Serverauthentifizierung an. Überschreibt -n, --netrc und --netrc-optional.

Wenn Sie nur den Benutzernamen angeben, fordert curl nach einem Passwort.

Benutzername und Passwörter werden beim ersten Doppelpunkt aufgeteilt, wodurch es mit dieser Option unmöglich ist, einen Doppelpunkt im Benutzernamen zu verwenden. Das Passwort jedoch schon.

Beim Verwenden von Kerberos V5 mit einem Windows-basierten Server sollten Sie den Windows-Domänennamen im Benutzernamen angeben, damit der Server erfolgreich ein Kerberos Ticket erhalten kann. Andernfalls kann der initiale Authentifizierungshandshake fehlschlagen.

Bei der Verwendung von NTLM kann der Benutzername einfach als Benutzername ohne Domäne angegeben werden, wenn beispielsweise nur eine Domäne und ein Forest in Ihrem Setup vorhanden sind.

Verwenden Sie entweder Down-Level-Anmelde-Name oder UPN (User Principal Name) Formate, um den Domänennamen anzugeben. Zum Beispiel, EXAMPLE\Benutzer und Benutzer@example.com.

Wenn Sie eine Windows SSPI-fähige curl-Binärdatei verwenden und Kerberos V5, Negotiate, NTLM oder Digest Authentifizierung durchführen, können Sie curl mit dieser Option mitteilen, den Benutzernamen und das Passwort aus Ihrer Umgebung auszuwählen, indem Sie einen einfachen Doppelpunkt angeben: "-u :".

Wenn diese Option mehrmals verwendet wird, wird die letzte verwendet.

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

Beachten Sie, dass Sie die --basic-Flag nicht benötigen, da sie standardmäßig aktiviert ist.

71voto

srghma Punkte 4184

Als Kopfzeile

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://beispiel.com/

18voto

nad2000 Punkte 3878

Der einfachste Weg herauszufinden, wie der Autorisierungsheader aussehen sollte, besteht möglicherweise darin, zunächst curl mit -u (oder das Einbetten der Anmeldeinformationen in der URL) und -v auszuführen. Die Ausgabe zeigt dann den Anforderungsheader:

$ curl -v -u 'apiuser:apipwd' ... http://apigilityhw.sandbox.loc/status

# Oder die Anmeldeinformationen in der URL einbetten:

$ curl -v ... http://apiuser:apipwd@apigilityhw.sandbox.loc/status

# Kopieren und Einfügen des "Authorization" Headers aus der Ausgabe:

$ curl -H 'Authorization: Basic YWRtaW46YXBpcHdk' ... http://apigilityhw.sandbox.loc/status

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X