25.8.2021 |

API-Anfragen mit curl und Cookies oder Bearer Tokens

Werkzeuge wie Postman oder Insomnia dienen Entwicklern bei dem Bauen von APIs. Mit solchen Programmen kann man beispielsweise eigene APIs während der Entwicklung testen, indem man Anfragen an die API schickt.

Nehmen wir an, dass wir eine API mit Authentisierung bauen.
Ein Benutzer soll einen Account anlegen können und sich einloggen und ausloggen können. Es soll ein Cookie erstellt werden, in welchem die Tatsache, dass der Benutzer eingeloggt ist, im Browser gespeichert werden kann.
Es soll einen Endpunkt /current-user geben, der mir den aktuellen Benutzer als Rückgabewert gibt, sofern ein Benutzer eingeloggt ist.

Wie kann ich meine API manuell testen, um herauszufinden, ob ein Cookie korrekt erstellt wurde und die /current-user-Route auch richtig funktioniert?

Wenn ich nicht auf UI Tools wie Postman zurückgreifen möchte, kann ich im Terminal mit curl arbeiten.
curl ist ein bewährtes Kommandozeilenprogramm, das seit 25 Jahren existiert und auf fast allen Unix-Desktops von Haus aus mitgeliefert wird.

curl kann auch Cookies speichern und senden:

curl -X POST -H 'Accept: application/json' -b cookiefile.txt -c cookiefile.txt https://example.com/signin -d {"email": "test@example.com", "password": "13456"}

Hier lesen wir das Cookie mit -b und speichern es mit -c in einer separaten Datei namens cookiefile.txt.

Wenn wir das Cookie bei einer Anfrage mitsenden wollen, machen wir es ebenso:

curl -b cookiefile.txt -c cookiefile.txt https://example.com/current-user

Damit lesen wir Cookies und speichern automatisch Änderungen - genau, wie es der Webbrowser tut.

Das Ganze funktioniert auch, wenn man statt Cookies lieber Bearer Tokens (JSON Web Tokens) verwenden möchte.

Zuerst sollten wir das Token anfragen und zwischenspeichern, z. B. als Umgebungsvariable im Terminal.

(Um das Token aus dem JSON-Format auslesen zu können, sollte man den Parser jq installiert haben.)

TOKEN=$(curl -s -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' --data '{"email":"test@example.com","password":"123456"}' https://example.com/signin | jq -r '.id_token')

Hier speichert man das Bearer Token in der Variable TOKEN zur späteren Verwendung. Im Beispiel ist das Token in dem folgenden Format:

{"id_token": "blablabla"}

Bei einer Anfrage an einen Endpunkt, welcher das Token benötigt, kann man es wie folgt mitschicken:

curl -H 'Accept: application/json' -H "Authorization: Bearer ${TOKEN}" https://example.com/current-user

So schickt curl eine Anfrage mit dem korrekten Token im Header.

Links

Zur Übersicht
Sophia Brandt

Mehr vom Devsquad...

Kerstin Paduch

UX vs. Service Design

Sven Röttering

Zx - A tool for writing better scripts

Hallo

Wir sind für Sie da und freuen uns auf Ihre Fragen oder Ihr Feedback.