Tibber Token: So bekommst Du Deinen Access Token


Tibber Access Token auf Smartphone mit Schlüssel-Symbol vor digitalem Netzwerk-Hintergrund und tiny-tool.de Logo

Personal Access Token (GraphQL) schnell erstellen, sicher speichern und sauber testen – plus Troubleshooting & Security-Checkliste.

Kurzes Update (Stand 2026): Für die klassische Tibber GraphQL API (z. B. https://api.tibber.com/v1-beta/gql) nutzt Du typischerweise einen Personal Access Token (Bearer Token). Die neuere Tibber Data API authentifiziert hingegen offiziell per OAuth2 (Authorization Code Flow, optional mit PKCE) mit kurzlebigen Access Tokens und Refresh Tokens.

In diesem Artikel geht’s primär um den schnellen PAT-Weg (perfekt für eigene Skripte/Home-Server) – und zusätzlich um Sicherheit, Tests und typische Fehlerbilder.

Schnellstart: Tibber Access Token in 5 Schritten

  1. Bei Tibber im Web einloggen (nicht im Demo-/Testkonto).
  2. developer.tibber.com öffnen.
  3. Unter Access Tokens einen neuen Token erstellen.
  4. Token einmalig kopieren und sicher ablegen (Passwort-Manager / Secret-Store).
  5. Mit einer Mini-GraphQL-Abfrage testen (API-Test).

Jetzt Token erstellen Erst Sicherheit checken

Tipp: Für eine App mit mehreren Nutzern ist OAuth2 (Data API) meist die bessere Wahl – für eigene Automationen ist der PAT pragmatisch und schnell.

Du bist neu bei Tibber und willst Deinen Access Token? Kein Stress: hier bekommst Du die Schritt-für-Schritt-Anleitung – inklusive Sicherheits-Checkliste, Test-Abfragen und den häufigsten Fehlern (401/403), die in der Praxis immer wieder auftauchen.


Was ist der Tibber Token?

Der Tibber Token ist Dein persönlicher „Schlüssel“ zur Tibber-API. Damit kannst Du – abhängig von Deinen Berechtigungen – z. B. Strompreise abrufen, Verbrauchsdaten analysieren oder Integrationen für Smart Home / Lade-Setups bauen.

Technisch ist das bei der GraphQL API ein Bearer Token: Du sendest ihn bei jeder Anfrage im HTTP-Header Authorization: Bearer <TOKEN>. Wer den Token besitzt, kann die API so benutzen, als wär’s Dein Account – deshalb gilt: behandle ihn wie ein Passwort.

Wenn Du tiefer einsteigen willst: Bei Tibber dreht sich vieles um dynamische Strompreise. In den Guides auf tiny-tool findest Du dazu z. B. dynamische Stromtarife, Hintergründe zu Erneuerbaren & Strompreis und den Praxis-Usecase Tibber Pulse.

Technischer Hintergrund: Authentifizierung vs. Autorisierung

Wenn es beim Tibber Access Token hakt, liegt der Fehler selten „irgendwo in GraphQL“, sondern fast immer in einem ganz klassischen Auth-Thema. Zwei Begriffe helfen beim Debugging sofort:

AuthN (Authentication) vs. AuthZ (Authorization)

  • Authentifizierung (AuthN): „Wer bist Du?“ – Das System prüft, ob ein gültiger Nachweis vorliegt (z. B. ein Token, ein Login, ein Zertifikat).
  • Autorisierung (AuthZ): „Was darfst Du?“ – Das System prüft, ob dieser Identität die angefragte Aktion oder Ressource erlaubt ist (Scopes, Rollen, Ownership).

Merksatz: Erst AuthN, dann AuthZ. Ein Request kann also korrekt „eingeloggt“ sein, aber trotzdem verboten bleiben.

401 vs. 403 – technisch sauber unterscheiden

  • 401 Unauthorized bedeutet in der Praxis: nicht authentifiziert. Typische Ursachen: Token fehlt, Token ist syntaktisch kaputt (Leerzeichen/Zeilenumbruch), falscher Header, falsche URL, oder das Token ist invalid/gelöscht.
  • 403 Forbidden bedeutet: authentifiziert, aber nicht berechtigt. Typisch: Du fragst Daten/Operationen ab, die Dein Token nicht darf (z. B. falscher Account-Kontext, Home/Subscription nicht vorhanden, oder eine API-Variante erwartet OAuth2 statt PAT).

Warum Bearer Tokens so sensibel sind

Ein Personal Access Token für Tibber GraphQL ist ein Bearer Token. „Bearer“ ist wörtlich zu nehmen: wer ihn trägt, darf. Es gibt keine zusätzliche „Bindung“ an ein Gerät oder eine Session, wenn Du das nicht selbst durch Architektur erzwingst (z. B. durch serverseitige Nutzung und Zugriffskontrollen).

PAT (GraphQL) vs. OAuth2 (Data API)

Bei Tibber triffst Du 2026 häufig auf zwei Auth-Ansätze, die ähnliche Ziele haben, aber für unterschiedliche Szenarien gebaut sind:

1) Personal Access Token (PAT) – Tibber GraphQL

  • Statisch/Manuell: Du erzeugst den Token im Developer Portal und nutzt ihn direkt als Bearer.
  • Ideal für: eigene Skripte, Home-Server, persönliche Automationen (Single-User), schnelle Prototypen.
  • Risiko: Wenn er leakt, ist der Schaden direkt da – darum ist Secret Handling Pflicht.

2) OAuth2 Authorization Code Flow (oft mit PKCE) – Tibber Data API

  • Benutzerbezogen: Nutzer loggen sich ein und geben einer App Zugriff. Die App bekommt kurzlebige Access Tokens und (je nach Setup) Refresh Tokens.
  • Ideal für: Multi-User-Apps, Integrationen mit mehreren Accounts, Produkte/Services, bei denen Du Tokens nicht manuell verwalten willst.
  • Vorteil: bessere Kontrolle (Laufzeiten, Widerruf, Rotation), sauberer Consent-Flow.

Kurz gesagt: PAT ist pragmatisch für Dich selbst. OAuth2 ist Standard, sobald mehrere Nutzer oder ein „echtes Produkt“ ins Spiel kommen.

Wenn Du gerade nur Deinen eigenen Tibber Token erstellen willst: bleib beim PAT. Wenn Du eine App für andere baust: plane OAuth2 von Anfang an ein (Datenminimierung, Widerruf, kurze Token-Laufzeiten).


Schritt-für-Schritt: Tibber API Token erstellen

  1. Registrieren: Falls noch nicht geschehen, Konto bei tibber.com anlegen.
  2. Einloggen: Im Web mit Deinen Zugangsdaten anmelden.
  3. Developer Portal öffnen: developer.tibber.com aufrufen.
  4. Token erstellen: Unter Access Tokens auf Create Token klicken.
  5. Token sichern: Token sofort kopieren und sicher speichern (er wird oft nur einmal angezeigt!).
  6. Testen: Mit den Beispiel-Requests weiter unten (API-Test).

Sicherheit: So gehst Du sorgsam mit Deinem Token um

→ Wenn Du nur eine Sache mitnimmst: Checkliste – und Token nie ins Frontend.

  • Geheim halten: niemals posten, niemals in Tickets/Screenshots leaken.
  • Sicher speichern: Passwort-Manager oder Secret-Store statt „Notepad“.
  • Im Code schützen: über ENV-Variablen / Secrets injizieren – nicht als Klartext im Repository.
  • Aufräumen: ungenutzte Tokens löschen; bei Verdacht sofort rotieren.

Sicherheitsarchitektur für produktive Umgebungen

Ein Tibber Access Token ist technisch „nur“ ein String – operativ ist er aber ein hochwertiges Secret. Sobald Du das nicht mehr nur lokal testest, sondern dauerhaft betreibst (Home-Server, NAS, Mini-PC, Cloud-VM), brauchst Du eine klare Architektur-Entscheidung: Wo liegt das Secret, wer darf es lesen, und wo könnte es unabsichtlich auftauchen?

Token gehört niemals ins Frontend

  • Browser/SPA: Alles, was im Frontend läuft, kann von Nutzer:innen (oder Extensions) ausgelesen werden – inklusive Network-Requests.
  • Mobile Apps: „Hidden“ ist nicht „secret“. Hardcoded Tokens oder Tokens im App-Bundle sind praktisch öffentlich.
  • Richtige Lösung: Token nur serverseitig verwenden und dem Frontend nur die minimal nötigen Daten liefern.

Reverse Proxy: hilfreich, aber nicht automatisch sicher

Ein Reverse Proxy (z. B. Nginx, Traefik, Caddy) kann TLS terminieren, Auth erzwingen und Requests routen. Er kann aber auch zum Risiko werden:

  • Header-Weitergabe: Achte darauf, dass Authorization-Header nicht versehentlich geloggt oder an interne Services weitergereicht werden, die ihn nicht brauchen.
  • Access Logs: Manche Setups loggen Request-Header oder Query-Strings (z. B. bei Debug-Mode). Das ist ein häufiger Leak-Kanal.
  • „Schnell mal nach außen“: Ein öffentlich erreichbarer Proxy-Endpoint ohne harte Auth kann Dritte zu Abuse/Rate-Limit-Problemen einladen.

Logging-Leaks: der Klassiker

  • Nie „Request object“ komplett dumpen, wenn Header enthalten sind.
  • Fehlerausgaben sollten Token maskieren (z. B. abcd…wxyz).
  • CI/CD Logs sind gefährlich: „echo $TOKEN“ ist praktisch ein Leak, weil Logs oft lange gespeichert werden.

Secret Management: was in der Praxis funktioniert

  • ENV Variablen: gut für lokale Nutzung und einfache Deployments – solange sie nicht in Logs/Crashdumps landen.
  • Docker/Kubernetes Secrets: besser als Klartext-ENV in Compose-Files, aber auch hier gilt: Zugriff auf Container/Node = Zugriff aufs Secret.
  • Vault/Cloud Secret Manager: am saubersten für produktive Systeme (Policy-basiert, Audit, Rotation, kurzlebige Credentials).
  • CI/CD Secrets: nutze Secret Stores des CI-Systems, aber vermeide, sie in Build-Artefakte oder Logs zu schreiben.

Token Rotation & „mehrere Tokens im Umlauf“

Rotation ist nicht nur „Security-Feeling“, sondern echte Schadenbegrenzung. Wichtig ist dabei der Prozess:

  1. Neuen Token erstellen (parallel, ohne Downtime).
  2. Deploy umstellen (ENV/Secret aktualisieren) und Smoke-Test fahren.
  3. Alten Token deaktivieren – erst wenn alles stabil läuft.
  4. Dokumentieren, wo Tokens liegen (welches System, welcher Zweck), damit Du bei Incidents schnell reagieren kannst.

Rate Limits & Retries ohne Abuse

Wenn Du 429 siehst, ist der Reflex oft „noch schneller nochmal“. Das ist genau falsch. Besser:

  • Exponential Backoff mit Jitter (kleine Zufallskomponente), um Lastspitzen zu vermeiden.
  • Max Retries begrenzen (z. B. 3–5 Versuche) und dann sauber failen.
  • Caching für Daten, die sich nicht sekündlich ändern (z. B. Preisinfos), statt Polling.

Datenschutz und verantwortungsvoller Umgang mit Energiedaten

Auch wenn es „nur“ Stromdaten sind: Verbrauchs- und Zeitreihen-Daten sind in der Praxis sensibel. Aus Lastprofilen lassen sich Muster ableiten (Anwesenheit, Tagesabläufe, ggf. sogar Urlaubszeiten). Deshalb lohnt es sich, beim Tibber GraphQL Zugriff ein paar Basics sauber zu machen – ohne Drama, aber konsequent.

Praktische Leitplanken

  • Datenminimierung: Nur Felder abfragen, die Du wirklich brauchst (GraphQL macht das leicht).
  • Logging-Hygiene: Keine Rohantworten mit personenbezogenen Details dauerhaft loggen. Für Debug: temporär und anonymisiert.
  • Retention: Lege fest, wie lange Du Daten speicherst (z. B. 30/90/365 Tage) – und lösche automatisiert.
  • Access Separation: Wenn mehrere Nutzer/Haushalte beteiligt sind: trenne Daten nach Tenant/Account, und nutze eher OAuth2 statt PAT.

Hinweis: Das ist keine Rechtsberatung. Es sind technische Best Practices, die in fast jedem System helfen, Risiken zu reduzieren.


Häufige Fragen und Stolperfallen

  • Token wird nach der Erstellung nicht mehr angezeigt? Ja, das ist normal. Daher: direkt kopieren und sicher speichern.
  • Demo-Account „Arya Stark“? Dann bist Du vermutlich im falschen Login-Kontext. Ausloggen, Cookies prüfen, neu einloggen.
  • Token verloren? Kein Drama: neuen erstellen, alten löschen.
  • Läuft der Token ab? Bei PATs oft nicht automatisch – er bleibt gültig, bis Du ihn deaktivierst/löschst.
  • Token löschen? Im Developer Portal deaktivieren/entfernen.

Fazit

Mit dem Tibber Token hast Du den Zugang zu vielen spannenden Energie-Projekten: von der Visualisierung Deiner Daten bis zu smarter Automatisierung.
Wenn Du magst, kombiniere Deinen Token z. B. mit Zeus Charge Control, um Ladezeiten und Börsenpreise clever zusammenzubringen. Vorraussetzung: Ladespeicher mit Sonnen API v2.

Viel Spaß beim Ausprobieren – und willkommen in der Welt smarter Energie. 🙂


API-Test (curl / GraphQL)

Ein schneller Check spart Dir später Debugging-Zeit: Die GraphQL API erwartet den Token als Bearer im Authorization-Header.

curl: Minimaler GraphQL-Check
curl https://api.tibber.com/v1-beta/gql \
  -H "Authorization: Bearer DEIN_TIBBER_TOKEN" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
  "query": "{ viewer { name } }"
}'
Erwartung: Bei gültigem Token bekommst Du Daten zurück (z. B. Deinen Namen im viewer-Objekt).
Bei 401 oder 403: siehe Troubleshooting.
curl: Praxis-Beispiel Strompreise
curl https://api.tibber.com/v1-beta/gql \
  -H "Authorization: Bearer DEIN_TIBBER_TOKEN" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
  "query": "{ viewer { homes { currentSubscription { priceInfo { current { total energy tax startsAt } } } } } }"
}'

Im Tibber GraphQL Explorer testen →

Praxis: Node.js & Python (Timeout, Errors, Retry)

Die curl-Tests oben sind perfekt, um „lebt der Token?“ zu prüfen. Für echte Skripte brauchst Du aber drei Dinge zusätzlich: ENV-Handling, saubere Fehlerbehandlung und Retries mit Backoff. Die folgenden Beispiele sind bewusst „produktionsnah“, aber gut lesbar gehalten.

ENV-Handling: so bleibt das Secret aus dem Code raus

  • Lokale Entwicklung: Token als Umgebungsvariable setzen (z. B. TIBBER_TOKEN) und nicht in Dateien committen.
  • Server/CI: Token im Secret Store hinterlegen und als ENV injizieren.
  • Validierung: Beim Start prüfen, ob die Variable gesetzt ist – und sonst mit einer klaren Fehlermeldung abbrechen.
Node.js (fetch): GraphQL Request mit Timeout + Retry (Backoff)
/**
 * Node.js 18+ (global fetch)
 * ENV: export TIBBER_TOKEN="..."
 */
const TIBBER_GQL_URL = "https://api.tibber.com/v1-beta/gql";
const TOKEN = process.env.TIBBER_TOKEN;

if (!TOKEN) {
  throw new Error("Missing ENV: TIBBER_TOKEN (set it in your shell/CI secret store)");
}

// Simple sleep helper
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

async function tibberQuery(query, variables = {}, opts = {}) {
  const {
    timeoutMs = 10_000,
    maxRetries = 4,
    baseDelayMs = 400,
  } = opts;

  // Exponential backoff with jitter
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const controller = new AbortController();
    const t = setTimeout(() => controller.abort(), timeoutMs);

    try {
      const res = await fetch(TIBBER_GQL_URL, {
        method: "POST",
        signal: controller.signal,
        headers: {
          "Authorization": `Bearer ${TOKEN}`,
          "Content-Type": "application/json",
          "Accept": "application/json",
        },
        body: JSON.stringify({ query, variables }),
      });

      // HTTP-level handling
      if (res.status === 401) {
        throw new Error("401 Unauthorized: token missing/invalid, or wrong Authorization header");
      }
      if (res.status === 403) {
        throw new Error("403 Forbidden: authenticated but not allowed (account context/permissions/API mismatch)");
      }
      if (res.status === 429 || res.status >= 500) {
        // Retry-worthy: rate limit or transient server errors
        const retryAfter = res.headers.get("retry-after");
        const hint = retryAfter ? ` (Retry-After: ${retryAfter})` : "";
        throw new Error(`${res.status}: transient error${hint}`);
      }
      if (!res.ok) {
        throw new Error(`Unexpected HTTP ${res.status}`);
      }

      const data = await res.json();

      // GraphQL-level handling
      if (data.errors && data.errors.length) {
        // Avoid logging full objects; keep it minimal
        const msg = data.errors[0]?.message || "GraphQL error";
        throw new Error(`GraphQL: ${msg}`);
      }

      return data.data;
    } catch (err) {
      const isLast = attempt === maxRetries;

      // AbortError => timeout
      const msg = (err && err.name === "AbortError")
        ? `Timeout after ${timeoutMs}ms`
        : (err?.message || String(err));

      if (isLast) {
        throw new Error(`Tibber request failed after ${maxRetries + 1} attempts: ${msg}`);
      }

      // Backoff: base * 2^attempt + jitter(0..200)
      const jitter = Math.floor(Math.random() * 200);
      const delay = baseDelayMs * (2 ** attempt) + jitter;
      await sleep(delay);
    } finally {
      clearTimeout(t);
    }
  }
}

// Example query
(async () => {
  const query = `{ viewer { name homes { id appNickname } } }`;
  const data = await tibberQuery(query);
  console.log("OK (minimal output):", { name: data?.viewer?.name, homes: data?.viewer?.homes?.length });
})();
Python (requests): Timeout + Status-Checks + Retry (Backoff)
"""
Python 3.x
ENV (bash): export TIBBER_TOKEN="..."
pip install requests
"""
import os
import time
import random
import requests

TIBBER_GQL_URL = "https://api.tibber.com/v1-beta/gql"
TOKEN = os.getenv("TIBBER_TOKEN")

if not TOKEN:
    raise RuntimeError("Missing ENV: TIBBER_TOKEN (set it in your shell/CI secret store)")

HEADERS = {
    "Authorization": f"Bearer {TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
}

def tibber_query(query: str, variables: dict | None = None,
                timeout_s: float = 10.0, max_retries: int = 4, base_delay_s: float = 0.4):
    variables = variables or {}

    for attempt in range(max_retries + 1):
        try:
            r = requests.post(
                TIBBER_GQL_URL,
                headers=HEADERS,
                json={"query": query, "variables": variables},
                timeout=timeout_s,
            )

            # HTTP-level checks
            if r.status_code == 401:
                raise RuntimeError("401 Unauthorized: token missing/invalid, or wrong Authorization header")
            if r.status_code == 403:
                raise RuntimeError("403 Forbidden: authenticated but not allowed (account context/permissions/API mismatch)")

            if r.status_code in (429,) or r.status_code >= 500:
                retry_after = r.headers.get("Retry-After")
                hint = f" (Retry-After: {retry_after})" if retry_after else ""
                raise RuntimeError(f"{r.status_code}: transient error{hint}")

            r.raise_for_status()

            payload = r.json()

            # GraphQL-level errors (avoid logging full payloads with sensitive content)
            if payload.get("errors"):
                msg = payload["errors"][0].get("message", "GraphQL error")
                raise RuntimeError(f"GraphQL: {msg}")

            return payload.get("data")

        except Exception as e:
            if attempt == max_retries:
                raise RuntimeError(f"Tibber request failed after {max_retries + 1} attempts: {e}") from e

            # Exponential backoff with jitter
            jitter = random.random() * 0.2
            delay = base_delay_s * (2 ** attempt) + jitter
            time.sleep(delay)

# Example query
if __name__ == "__main__":
    q = "{ viewer { name homes { id appNickname } } }"
    data = tibber_query(q)
    print("OK (minimal output):", {"name": data.get("viewer", {}).get("name"), "homes": len(data.get("viewer", {}).get("homes", []))})
Praxis-Tipp: Wenn Du automatisiert regelmäßig abfragst, bau Dir ein kleines Cache-Layer (z. B. 30–60 Sekunden) und rufe nicht im Sekundentakt dieselben Preisfelder ab. Das reduziert 429-Probleme massiv.

Troubleshooting (401 / 403 / 429 & realistische Fehlerbilder)

Hier sind Fehlerbilder, die in echten Setups (NAS, Raspberry Pi, Home-Server, CI/CD, Docker) ständig auftreten – inklusive konkreter Checks. Wenn Du systematisch vorgehst, findest Du die Ursache meist in wenigen Minuten.

1) 401 Unauthorized – „Token wird nicht akzeptiert“

  • Token fehlt wirklich: Prüfe, ob Dein Code die richtige ENV-Variable liest (z. B. TIBBER_TOKEN) und ob sie im Prozess vorhanden ist (Shell/Service/Docker).
  • Token hat unsichtbare Zeichen: Häufige Ursache sind Zeilenumbrüche beim Copy/Paste. In Logs sollte der Token niemals im Klartext stehen – aber Du kannst z. B. die Länge loggen oder prüfen, ob am Ende \n hängt.
  • Falscher Header: Muss exakt Authorization: Bearer <TOKEN> sein. Kein Token, kein Bearer:, kein Query-Parameter.
  • Falsche URL: Für GraphQL ist der klassische Endpoint oft https://api.tibber.com/v1-beta/gql. Ein Vertipper führt schnell zu „401/404/405“-Chaos.

2) 403 Forbidden – „Login ok, aber Zugriff verboten“

  • Falscher Account-Kontext: Du bist im Developer Portal im Demo-/Testkontext (z. B. „Arya Stark“) und erzeugst/benutzt den Token dort. Lösung: konsequent ausloggen, Cookies prüfen, korrekt einloggen, Token neu erstellen.
  • Ressource existiert nicht: Manche Queries erwarten, dass homes/currentSubscription vorhanden ist. Wenn nicht, wirkt es wie „Forbidden“, obwohl es inhaltlich ein „kein Zugriff/keine Daten“ ist.
  • API-Mismatch: Du nutzt einen PAT (Tibber GraphQL), aber der Endpoint/Usecase erwartet OAuth2 (Data API). Lösung: Auth-Mechanismus passend zur API wählen.

3) 429 Too Many Requests – „Rate Limit erwischt“

  • Backoff falsch: „Sofort nochmal“ verschärft das Problem. Nutze Exponential Backoff + Jitter und begrenze Retries.
  • Zu aggressives Polling: Wenn ein Cronjob alle 5 Sekunden läuft, sieht das aus wie Abuse. Lösung: Cache + sinnvolle Intervalle (z. B. Minuten, nicht Sekunden).
  • Mehrere Instanzen: Du hast denselben Job parallel auf NAS + VM + CI laufen (oder mehrere Container repliziert). Ergebnis: kumulierte Request-Rate.

Typische Stolperfallen (aus der Praxis) – Quick Checks

  • Token im falschen ENV: Lokale Shell hat TIBBER_TOKEN, aber Systemd/Docker nicht. Prüfe Service-Unit / Compose / CI-Secret.
  • CORS-Missverständnis: CORS ist ein Browser-Thema. Wenn Dein Backend funktioniert, aber das Frontend scheitert, ist das ein Signal, dass Du den Token fälschlich im Browser nutzt. Lösung: Token serverseitig.
  • Falsches JSON Escaping: Bei curl/Windows ist die Quote-Escaping-Hölle real. Teste erst im Explorer oder mit einem klaren JSON-Body (siehe Beispiele) und vermeide „smart quotes“.
  • 429 Backoff falsch implementiert: Kein Jitter, zu viele Retries, oder Retry ohne Max-Limit. Lösung: 3–5 Versuche, dann fail + alert.
  • Mehrere Tokens im Umlauf: Ein Token im Passwortmanager, ein anderer im Server-ENV, ein dritter im alten Container-Image. Lösung: Tokens benennen/dokumentieren und Altlasten deaktivieren.

Incident-Szenario: Token versehentlich ins Repo committed

  1. Sofort rotieren: Neuen Token erstellen, Deploy umstellen, alten Token im Tibber Portal deaktivieren.
  2. Repo bereinigen: Entferne das Secret aus dem Code. Wenn es in Git-History gelandet ist, reicht ein normaler Commit nicht.
  3. History rewrite: Nutze z. B. git filter-repo (oder BFG) und force-pushe – und informiere alle Collaborators.
  4. Prevention: Secret-Scanner im CI aktivieren und lokale Hooks (pre-commit) nutzen, damit es nicht wieder passiert.

Wichtig: Selbst wenn der Repo privat war – behandle es als Leak. Tokens sind Bearer Secrets.


Sicherheits-Checkliste (Do / Don’t)

Do ✅

  • Server-only: Token nur serverseitig verwenden (Backend/Proxy), nicht im Browser.
  • ENV/Secrets: Token per Umgebungsvariable oder Secret-Store injizieren.
  • Least Privilege: Wenn Scopes wählbar sind, nur die nötigen aktivieren.
  • Rotation: Token regelmäßig erneuern, spätestens bei Leak-Verdacht.

Don’t ❌

  • Token nicht in Git/Repos, nicht in Frontend-Code, nicht in Screenshots.
  • Keine endlosen Retry-Schleifen bei Fehlern (erst Ursache fixen).

FAQ (zusätzliche Praxisfragen)

Gibt es Scopes/Berechtigungen beim Tibber Token?

Je nach Token-/Portal-Art können Berechtigungen relevant sein. Bei 403 ist das der erste Prüfpunkt.

Sollte ich Tokens rotieren?

Ja – Rotation ist Security-Best-Practice. Neuen Token erstellen, Setup umstellen, alten löschen.

Warum klappt es im Explorer, aber nicht im Script?

Meist Header/Format (Bearer fehlt, JSON nicht korrekt escaped) oder Du nutzt im Script einen anderen Token als gedacht (ENV/Config).

GraphQL API vs. Data API – was ist der Unterschied?

GraphQL API wird häufig mit einem Personal Access Token genutzt. Die Data API setzt offiziell auf OAuth2 (Authorization Code Flow, Refresh Tokens, PKCE empfohlen) – ideal für echte Multi-User-Apps.

Muss ich den Token jemals im Browser verwenden?

Nein – das solltest Du vermeiden. Nutze stattdessen einen Backend-Endpoint als Proxy, der Tibber serverseitig anspricht.

Glossar

Kurz & knackig – damit Du die Begriffe im Artikel direkt einordnen kannst.

Access Token
Token zur Authentifizierung gegenüber einer API. Wird oft im Header übertragen (Bearer Token).
Bearer Token
Token-Typ, der im HTTP-Header Authorization: Bearer <token> gesendet wird. Wer den Token besitzt, „darf“ – daher geheim halten.
API
Programmierschnittstelle (Application Programming Interface). Definiert, wie Systeme Daten austauschen.
GraphQL
API-Technologie, bei der Du über Queries genau die Felder anforderst, die Du brauchst.
Scope
Berechtigungsumfang. Bestimmt, auf welche Daten/Operationen ein Token Zugriff hat.
ENV Variable
Umgebungsvariable. Standardmethode, um Secrets und Konfiguration in Deployments sicher zu injizieren.
Secret Management
Prozesse/Tools zur sicheren Speicherung und Ausgabe von Geheimnissen (Tokens, Keys), z. B. Vault, Cloud Secrets, CI/CD Secrets.
HTTP Status 401/403
401 = nicht authentifiziert (Token fehlt/ungültig). 403 = authentifiziert, aber nicht berechtigt (Scopes/Rechte fehlen).
Token Rotation
Regelmäßiges Ersetzen eines Tokens durch einen neuen, um Risiko durch Leaks zu reduzieren.
Rate Limit
Begrenzung, wie viele Requests in einem Zeitraum erlaubt sind. Bei Überschreitung kommt oft 429.