Grundlegende HTTP- und Bearer-Token-Authentifizierung

115

Ich entwickle derzeit eine REST-API, die für die Entwicklungsumgebung HTTP-Basic-geschützt ist. Da die eigentliche Authentifizierung über ein Token erfolgt, versuche ich immer noch herauszufinden, wie zwei Autorisierungsheader gesendet werden.

Ich habe es versucht:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

Ich könnte zum Beispiel die HTTP-Authentifizierung für meine IP deaktivieren, aber da ich normalerweise in verschiedenen Umgebungen mit dynamischen IPs arbeite, ist dies keine gute Lösung. Vermisse ich also etwas?

Azngeek
quelle
2
Ich muss mich über HTTP Basic authentifizieren, da der Dev-Server damit geschützt ist und ich die tokenbasierte Authentifizierung für die API benötige. Aber da ich Curl verwende, um die API zu testen, brauche ich eine Möglichkeit, beide Authentifizierungsheader zu senden. Also der erste (Basic), der HTTP Basic übergibt, und der zweite (Token), der sich bei meiner Anwendung authentifiziert. Und ja, es ist meine eigene Schöpfung.
Azngeek
1
Hast du das jemals herausgefunden? Ich füge ein Kopfgeld hinzu
Adam Waite
4
Hallo Adam, leider nicht. Ich habe jetzt die Funktionsweise der Authentifizierung geändert, indem ich meinen Autorisierungsheader für das Token in "x-auth" geändert habe, was kein Standardheader ist.
Azngeek
1
Mein Nginx-Server akzeptiert nicht einmal 2 Autorisierungsheader. Es gibt a zurück 400 Bad request. Dumm.
Rudie
1
Was ist falsch daran, einen benutzerdefinierten Header für Ihr API-Token zu verwenden? Ich verstehe nicht, warum die Leute hier mit HTTP Basic Auth "verschrottet" haben, um ihre Entwicklungs- / Staging-Server von neugierigen Blicken fernzuhalten.
Sunil D.

Antworten:

68

Versuchen Sie dies, um die Basisauthentifizierung unter URL zu pushen:

curl -i http://username:[email protected]/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

Wenn oben nicht funktioniert, haben Sie nichts damit zu tun. Versuchen Sie also die folgenden Alternativen.

Sie können das Token unter einem anderen Namen übergeben. Weil Sie die Autorisierung aus Ihrer Anwendung bearbeiten. Sie können diese Flexibilität also problemlos für diesen speziellen Zweck nutzen.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

Beachten Sie, dass ich den Header in geändert habe Application-Authorization. Fangen Sie also in Ihrer Anwendung das Token unter diesem Header ab und verarbeiten Sie, was Sie tun müssen.

Sie können auch tokendie POSTParameter durchlaufen und den Wert des Parameters von der Serverseite abrufen. Zum Beispiel Token mit Curl-Post-Parameter übergeben:

-d "auth-token=mytoken123"
Sabuj Hassan
quelle
1
Hallo Sabuj, das Problem ist nicht die Art und Weise, wie Sie den Benutzernamen und das Passwort übergeben, aber mehrere Autorisierungsheader funktionieren einfach nicht. Wenn ich mir die Spezifikationen ( ietf.org/rfc/rfc2617.txt ) ansehe, kann ich sehen, dass dies möglich sein sollte. Aber wie auch gesagt "" Der Benutzeragent MUSS sich dafür entscheiden, eine der Herausforderungen mit dem stärksten Authentifizierungsschema zu verwenden, das er versteht, und vom Benutzer basierend auf dieser Herausforderung Anmeldeinformationen anfordern. "Also, wie ich vor 2 Tagen geschrieben habe, musste ich die bestehen Token zu einem nicht standardmäßigen Header, der absolut in Ordnung ist, wenn Sie mit nicht standardmäßigen Architekturen arbeiten.
Azngeek
5
@Azngeek Curl sendet beide Berechtigungsheader, wenn Sie die Aufgabe ausführen. Sie müssen es vom Ende Ihres Servers aus handhaben. Führen Sie einfach Ihren Curl-Befehl mit beiden Headern mit -vparam aus. Sie werden feststellen, dass es Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123auf Anfrage Header sendet . Wenn Sie dies von Ihrem Server aus überprüfen, werden Sie feststellen, dass der Autorisierungsheader wie dieser Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123durch Komma getrennt ist. Also, ich denke, ich sollte Ihnen Alternativen vorschlagen.
Sabuj Hassan
34

Standard ( https://tools.ietf.org/html/rfc6750 ) sagt, dass Sie Folgendes verwenden können:

  • Formcodierter Körperparameter : Autorisierung: Inhaber mytoken123
  • URI- Abfrageparameter : access_token = mytoken123

Es ist also möglich, viele Bearer Token mit URI zu übergeben, dies wird jedoch nicht empfohlen (siehe Abschnitt 5 im Standard).

Janek Olszak
quelle
4

Wenn Sie einen Reverse-Proxy wie z. B. nginx dazwischen verwenden, können Sie ein benutzerdefiniertes Token definieren, z X-API-Token.

In Nginx würden Sie es so umschreiben, dass der Upstream-Proxy (Ihre Rest-API) nur auth ist:

proxy_set_header Authorization $http_x_api_token;

... während nginx den ursprünglichen Authorization-Header verwenden kann, um HTTP AUth zu überprüfen.

Zerkleinern
quelle
3

Ich hatte ein ähnliches Problem - Gerät und Benutzer am Gerät authentifizieren. Ich habe einen CookieHeader neben einem Authorization: Bearer...Header verwendet.

Iiridayn
quelle
Nicht klar, warum die Abstimmung. Ich bin auf diese Frage gestoßen, um eine Antwort auf ein verwandtes Problem zu finden - so habe ich es gelöst. Der CookieHeader wird bereits häufig zur Authentifizierung verwendet.
Iiridayn
2

locken --anyauth

Weist Curl an, die Authentifizierungsmethode selbst herauszufinden und die sicherste zu verwenden, die der Remote-Standort angeblich unterstützt. Dies erfolgt, indem zuerst eine Anforderung ausgeführt und die Antwortheader überprüft werden, wodurch möglicherweise ein zusätzlicher Netzwerk-Roundtrip induziert wird. Dies wird verwendet, anstatt eine bestimmte Authentifizierungsmethode festzulegen, die Sie mit --basic, --digest, --ntlm und --negotiate ausführen können.

bbaassssiiee
quelle
1

Es gibt eine andere Lösung zum Testen von APIs auf dem Entwicklungsserver.

  • Setzen Sie HTTP Basic Authenticationnur für Web - Routen
  • Lassen Sie alle API-Routen frei von Authentifizierung

Webserverkonfiguration für nginxund Laravelwäre wie folgt:

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer übernimmt die Aufgabe, den Entwicklungsserver gegen Webcrawler und andere unerwünschte Besucher zu verteidigen.

Andrew Kolpakov
quelle
0

Mit nginx können Sie beide Token wie folgt senden (obwohl dies gegen den Standard verstößt):

Authorization: Basic basic-token,Bearer bearer-token

Dies funktioniert, solange das Basistoken zuerst vorhanden ist. Nginx leitet es erfolgreich an den Anwendungsserver weiter.

Und dann müssen Sie sicherstellen, dass Ihre Anwendung den Träger ordnungsgemäß aus der obigen Zeichenfolge extrahieren kann.

Lacho Tomov
quelle