Få CLI-autentisering rätt: den kompletta guiden till alla 4 metoder
De 4 CLI-autentiseringsmetoderna som spelar roll, hur GitHub, AWS och AI-verktyg implementerar dem samt de säkerhetsmisstag du vill undvika.
Varje utvecklar-CLI levereras med login som sitt första kommando. Och alla löser autentisering på olika sätt.
GitHub visar dig en kod och öppnar din webbläsare för att verifiera den. AWS öppnar en webbläsare för PKCE-baserad SSO. Stripe låter dig bekräfta en parningskod i instrumentpanelen. De nyare AI-verktygen (Claude Code, OpenAI Codex CLI, Cursor) har alla valt sina egna metoder.
Om du bygger ett CLI är autentisering en av de första sakerna du måste reda ut. Väljer du fel metod så kommer du höra om det: frustrerade användare, säkerhetsgranskningar, eller båda. Och med den senaste vågen av AI-kodagenter som anropar CLI-verktyg programmatiskt är insatserna högre: du autentiserar inte bara en människa längre. Du kan komma att lämna ut inloggningsuppgifter till en autonom process.
Här är de fyra autentiseringsmetoder som spelar roll, hur de största verktygen implementerar dem och de misstag du vill undvika.
De fyra metoderna i korthet
Innan vi går på djupet, här är en snabb jämförelse:
| Metod | Bäst för | Säkerhet | Behövs webbläsare? |
|---|---|---|---|
| OAuth Device Code Flow | Headless-miljöer, SSH | Hög | Nej (på samma maskin) |
| Webbläsarbaserad OAuth (localhost-omdirigering) | Lokal utveckling | Högst | Ja |
| API-nycklar / PATs | Automatisering, CI/CD, prototyper | Medel | Nej |
| Client Credentials | Maskin-till-maskin, tjänster | Hög | Nej |
Varje metod har sina kompromisser. Här är vad du behöver veta om var och en.
1. OAuth device code flow (RFC 8628)
Detta är den där din CLI visar en kod som ABCD-1234 och en URL, och ber dig att öppna den URL:en på valfri enhet och mata in koden.
Vem använder det: GitHub CLI (standard), Azure CLI (via --use-device-code), Vercel CLI (bytte nyligen till denna som standard), OpenAI Codex CLI (som beta-alternativ)
Så fungerar det
- Du kör
cli login - CLI:t begär en enhetskod från autentiseringsservern och skickar sin
client_idoch begärda behörigheter - Servern returnerar tre saker: en
device_code(intern identifierare), enuser_code(koden du skriver in) och enverification_uri(var du ska gå in) - Din CLI visar koden och URL:en och börjar sedan poll:a autentiseringsservern var 5:e sekund eller mer
- Du öppnar URL:en på valfri enhet (telefon, laptop, annan dator), skriver in koden och autentiserar hur du vill (lösenord, SSO, passkeys, MFA)
- När du godkänner, returnerar nästa poll ett access token och ett refresh token
- CLI:t sparar dessa och du är inne
Varför utvecklare gillar det
Den stora fördelen: det fungerar överallt. SSH-session till en fjärrserver? Funkar. Kör inuti en Docker-container? Funkar. Cloud IDE utan lokal webbläsare? Funkar. Webbläsaren behöver inte vara på samma maskin som CLI:t.
Det stöder också hela spannet av företagsautentisering (SAML, OIDC, MFA) eftersom allt detta sker i webbläsaren, inte i terminalen. CLI:t ser aldrig ditt lösenord.
Säkerhetsfällan de flesta missar
Device code flow har ett nätfiskeproblem. En angripare kan initiera en enhetskodsförfrågan, få en legitim användarkod och lura dig att mata in den, vilket ger angriparen behörighet. Det här är inte teoretiskt. Säkerhetsforskare har dokumenterat denna attack mot AWS SSO device code auth.
Detta är tillräckligt oroande för att AWS ändrade standarden. Från och med AWS CLI v2.22.0 är standarden för aws sso login PKCE-baserad authorization code flow istället för device code flow. Device code finns fortfarande via --use-device-code, men det är inte längre standardvägen.
Samtidigt har Microsofts egen tenant börjat blockera device code flow helt och hållet via conditional access-policies, vilket är en stark signal om att de ser det som en högriskmetod.
Så vi har en intressant splittring: Vercel införde device code flow som standard i september 2025, medan AWS gick bort från det. Mönstret verkar vara att device code flow är utmärkt i miljöer där du verkligen inte kan öppna en webbläsare, men om du kan öppna en lokalt är PKCE det säkrare valet.
På leverantörssidan växer efterfrågan tydligt. Logto har precis lanserat stöd för OAuth 2.0 Device Authorization Grant för native-appar i v1.38.0 (öppen källkod) och Logto Cloud, så du kan nu aktivera enhetsflöde som auktorisationsmetod för vilken native-applikation som helst. Det här är viktigt om du bygger ett CLI. Att implementera RFC 8628 korrekt (kodutgång, begränsning av anrop, polling-logik, sign-in-UX på verifieringssidan) är mer arbete än de flesta team tror, och om din autentiseringsleverantör hanterar det behöver du bara göra rätt HTTP-anrop.
Tekniska detaljer från RFC:n
Här är några saker att känna till från RFC 8628:
expires_in-värdet för device codes sätts av auth-servern. RFC ger 1800 sekunder (30 minuter) som exempel, men det är inget krav.- Om servern inte anger polling-
intervalmåste klienten använda 5 sekunder. - Om du får ett
slow_down-fel, lägg till 5 sekunder till intervallet. - Device codes bör vara engångskoder och löpa ut snabbt.
- Alla tokenutbyten måste ske via HTTPS.
2. Webbläsarbaserad OAuth (localhost-omdirigering)
Detta är den vanligaste metoden för CLIs på utvecklarens lokala maskin. Du kör login, webbläsaren öppnas, du autentiserar och webbläsaren skickas tillbaka till en lokal server som CLI:t startar tillfälligt. Moderna implementationer lägger till PKCE (uttalas "pixie") ovanpå, vilket gör flödet mycket svårare att utnyttja.
Vem använder det: Claude Code, gcloud CLI, Terraform CLI, AWS CLI v2.22+ (för SSO, med PKCE som standard)
Så fungerar det
- Du kör
cli login - CLI:t startar en tillfällig HTTP-server på en slumpmässig lokal port (t.ex.
http://127.0.0.1:8742) - Det öppnar din standardwebbläsare till autentiseringsleverantörens auktorisations-endpoint, med localhost-URL:en som redirect URI
- Du autentiserar i webbläsaren (SSO, lösenord, passkeys, vad leverantören än stöder)
- Autentiseringsleverantören omdirigerar webbläsaren till
http://127.0.0.1:8742/callback?code=XXXX&state=YYYY - Den lokala servern fångar upp authorization code, byter den mot tokens via ett HTTPS-anrop
- Webbläsaren visar en "Success! Du kan stänga denna flik"-sida
- CLI:t sparar token och stänger servern
Användarupplevelsen är smidig. Inga koder att kopiera, inga URL:er att skriva in. Bara en flik som öppnas och stängs.
När det inte fungerar
Detta fungerar bara när CLI:t kan öppna en webbläsare och binda till localhost. Det fungerar inte för:
- SSH-sessioner till fjärrservrar
- Docker-containrar (såvida du inte gör port-forwarding-knep)
- CI/CD pipelines
- Headless-servrar
- Vissa låsta företagsmiljöer
Därför har de flesta verktyg som använder browser OAuth också ett fallback, vanligtvis device code flow eller API-nycklar.
Tre säkerhetsfällor som ofta återkommer
Fallgrop 1: Bindning till 0.0.0.0 istället för 127.0.0.1
Detta är det vanligaste misstaget och det är allvarligt. Om din callback-server lyssnar på alla gränssnitt kan vem som helst på samma nätverk fånga upp authorization code.
Jag har sett detta i produktions-CLI:er. Det är lätt att missa eftersom många HTTP-serverbibliotek använder 0.0.0.0 som standard.
Fallgrop 2: Saknad validering av state-parameter
state-parametern är ditt CSRF-skydd. Utan den kan en angripare lura ditt CLI att acceptera en authorization code från en skadlig session.
Fallgrop 3: Att inte använda PKCE
Om ditt OAuth-flöde inte använder PKCE (Proof Key for Code Exchange) kan authorization code fångas upp och återanvändas.
I ett vanligt authorization code flow kan en angripare som fångar authorization code (via nätverket, eller genom att läsa redirect-URL:en) byta ut den mot tokens. PKCE förhindrar detta genom att kräva bevis på att tokenutbytet initierats av samma klient som startade auktorisationen.
Detta lägger PKCE till i flödet:
- Innan flödet startar genererar CLI:t en slumpmässig
code_verifier(en stark sträng) - Skapar en
code_challengegenom att hasha verifiern med SHA-256 - Skickar challenge med första anropet
- När koden byts mot token skickar CLI:t ursprungliga
code_verifier - Auth-servern verifierar att verifier och challenge matchar
En angripare som fångar authorization code har inte code_verifier, så hen kan inte slutföra bytet.
Detta är anledningen till att AWS CLI v2.22+ gjorde PKCE till standard för SSO och gick bort från device code flow. När CLI:t kan öppna en webbläsare på samma maskin är browser OAuth med PKCE helt enkelt bättre än device code flow — samma användarupplevelse, starkare säkerhetsgarantier, ingen risk för nätfiske. Device code flow är rätt val när webbläsaren inte kan vara på samma maskin (SSH, containers, fjärrutveckling), men det är inte det vanliga för lokal utveckling.
3. API-nycklar och personliga access tokens
Det enklaste tillvägagångssättet. Du genererar en token i en webbpanel, klistrar in den i din CLI-konfiguration eller en miljövariabel, klart.
Vem använder det: Stripe CLI (som inloggningsval), npm, pip, de flesta AI-kodverktyg som fallback (Claude Code via ANTHROPIC_API_KEY, OpenAI via OPENAI_API_KEY, Aider)
Så fungerar det
- Logga in på tjänstens webbpanel
- Gå till inställningar → API-nycklar (eller personliga access tokens, eller utvecklarnycklar)
- Skapa en ny nyckel, oftast en lång slumpmässig sträng med prefix (t.ex.
sk_live_,ghp_,npm_) - Spara den i en konfigfil (
~/.config/stripe/config.toml,~/.aws/credentials) eller som miljövariabel
CLI:t läser den vid start och skickar med i API-anrop, oftast som en Bearer-token i Authorization-headern.
Varför det fortfarande är populärt trots riskerna
För automatisering är API-nycklar svårslagna. De funkar i CI/CD, containers, skript, cronjobb — överallt där man kan läsa en miljövariabel. Ingen webbläsare krävs. Inga interaktiva prompts. Ingen token-refresh-dans.
För AI-agent-arbetsflöden är API-nycklar den enklaste vägen. När Claude Code eller Cursor behöver anropa ett API är en miljövariabel med en API-nyckel den smidigaste integrationspunkten.
Riskerna är verkliga
- Läckor. API-nycklar hamnar i git-commits, loggfiler, felmeddelanden och CI-utskrifter. GitHub scannar efter exponerade tokens och rapporterar över en miljon läckta hemligheter per år.
- För breda rättigheter. De flesta API-nycklar ger bred access. Om de läcker blir spridningen av skadan stor.
- Ingen MFA. API-nycklar går förbi din välkonfigurerade multi-faktorautentisering.
- Svåra att rotera. Varje gång du byter nyckel måste du byta överallt där den används. Med team blir det en koordineringsutmaning.

