Kurzlebige Zugriffstoken anfordern
Voraussetzungen
Abschnitt betitelt „Voraussetzungen“- Sie haben einen Service Account: Neuen Service Account erstellen
- Sie haben einen Service Account-Schlüssel erstellt: Neuen Service Account-Schlüssel erstellen
Vorgehen
Abschnitt betitelt „Vorgehen“Verwenden Sie diesen Befehl, wenn das Schlüsselpaar von STACKIT generiert wurde:
stackit auth activate-service-account --service-account-key-path service-account.json --only-print-access-tokenVerwenden Sie diesen Befehl, wenn Sie den Private Key selbst erstellt haben:
stackit auth activate-service-account --service-account-key-path service-account.json --private-key-path key.pem --only-print-access-tokenLesen Sie die Dokumentation Request short lived API access token im API Explorer.
Manuelle Implementierung
Abschnitt betitelt „Manuelle Implementierung“Um einen kurzlebiges Zugriffstoken manuell anzufordern, müssen Sie zuerst ein JWT erstellen und signieren. Dazu werden die folgenden Felder benötigt:
Header:
Abschnitt betitelt „Header:“- kid: Füllen Sie dieses Feld, indem Sie den entsprechenden Schlüssel aus der service-account.json extrahieren
- alg: Ihr Signaturalgorithmus. Wir empfehlen „RS512“
- typ: „JWT“
Payload:
Abschnitt betitelt „Payload:“- iss: Füllen Sie dieses Feld, indem Sie den entsprechenden Schlüssel aus der service-account.json extrahieren
- sub: Füllen Sie dieses Feld, indem Sie den entsprechenden Schlüssel aus der service-account.json extrahieren
- aud: Füllen Sie dieses Feld, indem Sie den entsprechenden Schlüssel aus der service-account.json extrahieren
- jti: Füllen Sie dieses Feld, indem Sie einen uuidv4-String generieren
- iat: Füllen Sie dieses Feld mit der aktuellen Zeit im Epochenzeitformat in Ihrer lokalen Zeit
- exp: Füllen Sie dieses Feld mit der aktuellen Zeit (lokale Zeit) + 600 Sekunden im Epochenzeitformat
Das folgende Bash-Skript implementiert all diese Schritte. Bitte verwenden Sie es als Referenz für Ihre manuelle Implementierung:
#!/bin/bash
set -euo pipefail
CONFIG="service-account.json"TOKEN_URL="https://service-account.api.stackit.cloud/token"
# --- Konfiguration aus JSON-Datei lesen ---ISS=$(jq -r '.credentials.iss' "$CONFIG")SUB=$(jq -r '.credentials.sub' "$CONFIG")AUD=$(jq -r '.credentials.aud' "$CONFIG")KID=$(jq -r '.credentials.kid' "$CONFIG")PRIVATE_KEY_RAW=$(jq -r '.credentials.privateKey' "$CONFIG")
# --- Private Key in Datei schreiben ---PRIVATE_KEY_FILE=$(mktemp)echo "$PRIVATE_KEY_RAW" | sed 's/\\n/\n/g' > "$PRIVATE_KEY_FILE"
# --- Zeitstempel für JWT ---NOW=$(date +%s)EXP=$((NOW + 600)) # Setzt die Gültigkeit des Tokens auf zehn MinutenJTI=$(uuidgen) # Optional in der Spezifikation, aber für STACKIT obligatorisch
# --- JWT-Header & -Payload ---HEADER=$(jq -nc --arg kid "$KID" '{alg:"RS512", typ:"JWT", kid:$kid}')PAYLOAD=$(jq -nc \ --arg iss "$ISS" \ --arg sub "$SUB" \ --arg aud "$AUD" \ --arg jti "$JTI" \ --argjson iat "$NOW" \ --argjson exp "$EXP" \ '{iss:$iss, sub:$sub, aud:$aud, iat:$iat, exp:$exp, jti:$jti}')
# --- Base64URL-Kodierungsfunktion ---b64enc() { openssl base64 -e -A | tr '+/' '-_' | tr -d '='}
# --- JWT erstellen und signieren ---HEADER_B64=$(echo -n "$HEADER" | b64enc)PAYLOAD_B64=$(echo -n "$PAYLOAD" | b64enc)DATA="${HEADER_B64}.${PAYLOAD_B64}"
SIGNATURE=$(echo -n "$DATA" | openssl dgst -sha512 -sign "$PRIVATE_KEY_FILE" | b64enc)JWT="${DATA}.${SIGNATURE}"
echo "$JWT"
# --- Zugriffstoken anfordern ---echo "🔐 Anfrage an $TOKEN_URL ..."RESPONSE=$(curl --fail -sS -X POST "$TOKEN_URL" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \ -d "assertion=$JWT") || { echo "❌ Fehler beim Anfordern des Tokens" exit 1}
# --- Zugriffstoken extrahieren ---ACCESS_TOKEN=$(echo "$RESPONSE" | jq -r '.access_token')
if [[ "$ACCESS_TOKEN" == "null" || -z "$ACCESS_TOKEN" ]]; then echo "❌ Kein Zugriffstoken empfangen!" echo "$RESPONSE" exit 1fi
# --- Ausgabe ---echo "✅ Zugriffstoken empfangen:"echo "$ACCESS_TOKEN"
# --- Bereinigen ---rm -f "$PRIVATE_KEY_FILE"