Zum Inhalt springen

Wie die Browser-Anmeldung der CodeCharter-CLI funktioniert

Wie codecharter login eine Entwicklermaschine über den Browser anmeldet, was ein Device-Token ist und was der Logout bewirkt.

codecharter login meldet eine einzelne Maschine über deine normale Browser-Session am Portal an. Das ist der bequeme Weg, eine Entwickler-Workstation zu lizenzieren: kein API-Key, den du herumkopierst, keine Lizenzdatei, die du von Hand herunterlädst. Die Maschine erhält ein Device-Token, das genau eines kann, nämlich eine kurzlebige Lizenz für deinen Account erneuern, und das du jederzeit im Portal widerrufen kannst.

Für das CI und andere Umgebungen ohne Browser bleibt der API-Key das richtige Credential. Was wo gilt, steht unter Credentials und Reihenfolge.

Anmelden

Führe den Befehl auf der Maschine aus, die du anmelden willst:

codecharter login

Die CLI startet eine Anmeldung beim Portal und öffnet deinen Standardbrowser auf der Bestätigungsseite. Sie gibt Seite und Code zusätzlich aus, damit auch eine SSH-Session oder eine Maschine ohne Desktop funktioniert:

Your browser has been opened to complete the sign-in.

    https://codecharter.tools/activate
    Code: 7QRX-4KTB

Konnte kein Browser geöffnet werden, lautet die erste Zeile stattdessen "Open this page in a browser to complete the sign-in:", und du öffnest die ausgegebene Seite selbst, von einem beliebigen Gerät aus. Der Browser, in dem du bestätigst, muss nicht auf der Maschine laufen, die sich anmeldet.

Der Code besteht aus acht Zeichen in zwei Vierergruppen. Er verwendet nur die Ziffern 2 bis 9 und Großbuchstaben ohne I und O, damit beim Ablesen vom einen und Eintippen ins andere Fenster nichts zu verwechseln ist. Er ist zehn Minuten gültig, danach muss die Anmeldung neu gestartet werden.

Während du bestätigst, fragt die CLI beim Portal immer wieder nach und gibt Waiting for you to confirm the code... aus.

Im Browser bestätigen

Die Bestätigungsseite ist /activate und setzt voraus, dass du am Portal angemeldet bist. Bist du das nicht, landest du zuerst auf der normalen Login-Seite und wirst danach zurückgeführt. Wenn die CLI den Browser geöffnet hat, ist der Code bereits eingetragen; angezeigt und explizit bestätigt wird er in jedem Fall.

Die Seite zeigt vor der Entscheidung zwei Dinge:

  • Gerät, also wie die Maschine sich ausweist. Die CLI sendet CodeCharter CLI on <Maschinenname>.
  • Code, damit du ihn mit dem im Terminal vergleichen kannst.

Vergleiche beides. Wenn dir jemand anderes einen Code geschickt hat, bestätige ihn nicht: Eine Bestätigung gibt dieser Maschine das Recht, bis zum Widerruf Lizenzen für deinen Account zu erneuern. Mit Bestätigen schließt du die Anmeldung ab, mit Ablehnen weist du sie zurück.

Nach der Bestätigung

Sobald du bestätigt hast, speichert die CLI die Credentials und ist fertig:

Signed in. The device token and license are stored on this machine.

Der Befehl endet mit Exit-Code 0. Alle lizenzpflichtigen Befehle funktionieren auf dieser Maschine ab jetzt ohne weitere Konfiguration, und die Lizenz wird kurz vor Ablauf automatisch aus dem gespeicherten Device-Token erneuert.

Lehnst du die Anmeldung ab, gibt die CLI Sign-in was denied in the browser. aus und endet mit Exit-Code 1. Laufen die zehn Minuten ab, gibt sie The code expired before it was confirmed. Run 'codecharter login' again. aus und endet ebenfalls mit Exit-Code 1. Ist dein Abo zwischen Bestätigung und nächster Abfrage ausgelaufen, gibt sie Your account has no active subscription. Visit the portal to start a trial or subscribe. aus und hört dort auf, statt den Code auszuwarten. Schließe im Portal ein Abo ab und führe codecharter login erneut aus, dann zeigt die CLI dir einen neuen Code zum Bestätigen.

Was wo gespeichert wird

Es werden zwei Dateien in deinem benutzereigenen Konfigverzeichnis abgelegt, also dort, wo auch der Lizenz-Cache liegt:

Datei Inhalt
codecharter.device-token Das Device-Token dieser Maschine
codecharter.license Die zusammen damit ausgestellte kurzlebige Lizenz

Das Verzeichnis ist $XDG_CONFIG_HOME/codecharter unter Linux und macOS, %APPDATA%\CodeCharter unter Windows, mit $HOME/.config/codecharter als Fallback für Unix-Systeme ohne XDG_CONFIG_HOME. Unter Unix wird die Token-Datei nur für den Eigentümer lesbar angelegt, sie ist also zu keinem Zeitpunkt für andere Konten auf der Maschine lesbar.

Kann die CLI kein benutzereigenes Konfigverzeichnis ermitteln, meldet sie "signed in, but no per-user config directory was found to store the credentials" und endet mit Exit-Code 1. Es wird dann nichts gespeichert, führe den Befehl einfach erneut aus, sobald eines der Verzeichnisse oben verfügbar ist.

Was ein Device-Token darf

Ein Device-Token beginnt mit cgd_ und hat genau eine Berechtigung: eine kurzlebige Lizenz für deinen Account ausstellen. Mehr kann es nicht.

  • Es kann nicht deine Regeln, Profile oder Entwürfe lesen oder ändern.
  • Es kann nicht CLI-Archive herunterladen oder Checks veröffentlichen.
  • Jeder Portal-Endpunkt außer der Lizenzerneuerung weist es mit 403 Forbidden ab, unabhängig davon, was dein Account sonst darf.

Das ist der praktische Unterschied zum API-Key, der read:rules und optional write:rules trägt. Ein geleaktes Device-Token taugt nicht dazu, deine Regelinhalte zu lesen, und auch nicht dazu, etwas hochzuladen.

Das Token selbst hat kein Ablaufdatum. Es bleibt gültig, bis du es im Portal widerrufst, weshalb das Portal dir jede angemeldete Maschine auflistet, siehe Autorisierte Geräte.

Als welches Konto eine Maschine angemeldet ist

Eine Maschine ist als die Person angemeldet, die den Code im Browser bestätigt, und die erneuerte Lizenz ist die dieses Kontos. Dieses Konto braucht ein aktives Abo. Fehlt es, sagt die Bestätigungsseite das, statt die Bestätigung anzunehmen, und dein Code bleibt gültig: Starte eine Testphase oder schließe ein Abo ab und bestätige denselben Code danach, solange die zehn Minuten noch laufen. Ein Gerät, das du nicht kennst, kannst du unabhängig vom Abo ablehnen.

Die Browser-Anmeldung deckt also deine eigenen Maschinen ab, nicht die deiner Kolleginnen und Kollegen. Das Portal arbeitet mit einem Einzelkonto-Modell, im Team bleibt die Lizenzdatei der Weg, alle anderen zu lizenzieren, siehe CodeCharter im Team ausrollen. Eine angemeldete Maschine verbraucht oder belegt keinen Sitz, Sitze zählen pro Entwickler, nicht pro Geräteeintrag.

Aktuellen Stand prüfen

codecharter auth status zeigt, mit welchem Credential sich diese Maschine authentifizieren würde, ohne das Credential selbst jemals auszugeben:

Portal:      https://codecharter.tools
Credential:  device token (/home/you/.config/codecharter/codecharter.device-token)
License:     valid, plan Team, expires 2026-08-01 09:14:22Z

Die Zeile Credential lautet API key from CODECHARTER_API_KEY, wenn die Umgebungsvariable gesetzt ist, device token (<Pfad>), wenn diese Maschine angemeldet ist, und none - run 'codecharter login', or set CODECHARTER_API_KEY, wenn beides fehlt.

Da weder Key noch Token ausgegeben werden, kannst du die Ausgabe bedenkenlos in eine Support-Anfrage kopieren. Mit --json erhältst du ein maschinenlesbares Objekt mit den Feldern portal_url, credential (api_key, device_token oder none), device_token_path sowie ein license-Objekt mit valid, plan, expires_at und message. Der Befehl ist nicht lizenzpflichtig und endet immer mit Exit-Code 0.

Abmelden

codecharter logout

Das entfernt das gespeicherte Device-Token von dieser Maschine:

Signed out. The stored device token was removed from this machine.
The cached license is left in place and will simply expire; it is no longer renewed from here.

Zwei Punkte sind hier wichtig.

Der Logout ist lokal. Er entfernt das Token von dieser Maschine, macht es im Portal aber nicht ungültig. Um eine Maschine dauerhaft auszusperren, etwa weil du keinen Zugriff mehr darauf hast, widerrufst du das Gerät stattdessen im Portal, siehe Autorisierte Geräte.

Die gecachte Lizenz bleibt bewusst liegen. Sie kann aus einem API-Key oder von einem Installer stammen statt aus einer Browser-Anmeldung, ein Löschen würde also Setups zerstören, die der Logout nie angefasst hat. Sie ist kurzlebig, und ohne Token erneuert sie niemand mehr.

War kein Token gespeichert, meldet der Befehl "Not signed in on this machine; there was no stored device token to remove." So oder so endet er mit Exit-Code 0, du kannst ihn also ohne Sonderfälle in ein Aufräumskript packen.

Optionen

Option Befehl Wirkung
--portal-url <url> login An einem anderen Portal als dem konfigurierten anmelden
--json login Die Anmeldung als zeilenweise JSON-Events ausgeben
--json auth status Maschinenlesbares JSON statt Text ausgeben
--license <pfad> auth status Eine bestimmte Lizenzdatei statt des Standard-Suchpfads prüfen

login, logout und auth status sind nicht lizenzpflichtig. Sie sind der Weg, auf dem eine Maschine überhaupt erst zu einer Lizenz kommt, eine Lizenz vorauszusetzen wäre also zirkulär.

Ohne --portal-url nutzt login die Umgebungsvariable CODECHARTER_PORTAL_URL, sofern sie gesetzt ist, und sonst das konfigurierte Portal. Akzeptiert werden nur https-URLs, dazu http auf Loopback für die lokale Entwicklung.

Die Anmeldung skripten

codecharter login --json schreibt ein JSON-Objekt pro Zeile auf die Standardausgabe, damit eine Editor-Erweiterung oder ein Skript der Anmeldung folgen kann, ohne Fließtext zu parsen:

{"event":"code","verification_uri":"https://codecharter.tools/activate","user_code":"7QRX-4KTB"}
{"event":"status","status":"pending"}
{"event":"status","status":"success"}

Das status-Vokabular ist pending, success, denied, expired und subscription_required. Der letzte Wert beendet die Anmeldung sofort, sobald das Portal ihn meldet, statt den Code auslaufen zu lassen. Fehler gehen als {"event":"error","message":"..."} auf die Standardfehlerausgabe, damit der Event-Stream auf der Standardausgabe sauber bleibt.

Troubleshooting

Der Browser öffnet sich, aber der Code wird nicht akzeptiert

Codes sind zehn Minuten gültig. Stand das Terminal länger offen, ist der Code weg und die Seite sagt das auch. Führe codecharter login erneut aus und nimm den neuen Code.

"Ihr Konto hat kein aktives Abo"

Eine bestätigte Anmeldung stellt nur dann eine Lizenz aus, wenn der bestätigende Account ein aktives Abo hat. Zwei Stellen sagen dir, wenn das nicht der Fall ist, und keine davon kostet dich den Code:

  • Im Browser. Die Bestätigungsseite lehnt die Bestätigung ab und erklärt warum, mit einem Link zu deiner Abrechnungsseite. Es wird nichts gespeichert, der Code bleibt gültig und die Maschine wartet weiter. Schließe in einem zweiten Tab ein Abo ab, komm zurück und bestätige denselben Code, dann läuft die Anmeldung normal durch.
  • Auf der wartenden Maschine. Ist das Abo erst nach der Bestätigung abgelaufen, gibt die CLI sofort Your account has no active subscription. Visit the portal to start a trial or subscribe. aus und endet mit Exit-Code 1, statt auf den Ablauf des Codes zu warten. Da der Befehl damit schon beendet ist, führst du nach dem Abschluss des Abos codecharter login erneut aus und bestätigst den neuen Code.

In keinem der beiden Fälle wird deine Bestätigung verbraucht, im Portal bleibt also nichts halb erledigt zurück.

Viele Anmeldeversuche hintereinander

Die Anmelde-Endpunkte sind pro IP-Adresse ratenbegrenzt. Wenn du den Befehl in einer Schleife skriptest, antwortet das Portal mit 429 Too Many Requests und einem Retry-After-Header, der die Wartezeit in Sekunden nennt.

Die Maschine ist ein CI-Runner

Melde einen Runner nicht per codecharter login an. Gib ihm stattdessen einen API-Key als Secret, siehe API-Keys in Secrets. Ist ein Runner zufällig eine Maschine, auf der sich einmal jemand angemeldet hat, hat der API-Key aus der Umgebung ohnehin Vorrang, der Job übernimmt also nie die Identität eines Entwicklers.

Weiterführend