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-Code1, statt auf den Ablauf des Codes zu warten. Da der Befehl damit schon beendet ist, führst du nach dem Abschluss des Aboscodecharter loginerneut 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.