Zum Inhalt springen

Kurzlebige Zugriffstoken anfordern

Verwenden Sie diesen Befehl, wenn das Schlüsselpaar von STACKIT generiert wurde:

Terminal-Fenster
stackit auth activate-service-account --service-account-key-path service-account.json --only-print-access-token

Verwenden Sie diesen Befehl, wenn Sie den Private Key selbst erstellt haben:

Terminal-Fenster
stackit auth activate-service-account --service-account-key-path service-account.json --private-key-path key.pem --only-print-access-token

Um einen kurzlebiges Zugriffstoken manuell anzufordern, müssen Sie zuerst ein JWT erstellen und signieren. Dazu werden die folgenden Felder benötigt:

  • 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“
  • 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 Minuten
JTI=$(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 1
fi
# --- Ausgabe ---
echo "✅ Zugriffstoken empfangen:"
echo "$ACCESS_TOKEN"
# --- Bereinigen ---
rm -f "$PRIVATE_KEY_FILE"