background
cli-authv0.1.0-beta

OAuth de nível de produção para a tua CLI

Uma biblioteca de autenticação completa e totalmente flexível. Quatro fluxos. Armazenamento de tokens, refresh, bloqueio entre processos, integração com keychain. Cada peça tratada, todas são trocáveis.

$npm install cli-auth
Licença MITNode.js 22+Bun 1.1+Só ESMTypeScript
~/projects/your-cli — zsh

Quatro fluxos. Uma biblioteca.

Escolhe uma estratégia. A infraestrutura vem incluída.

Código de dispositivoRFC 8628

O ideal para servidores, shells Docker e qualquer máquina onde abrir um browser não é opção.

  • O ciclo de polling gere o back-off slow_down e a validade do código por ti
  • O código do utilizador passa por um callback onAuthorization para mostrares como quiseres
  • Faz refresh automático quando o access token está a expirar
Quando usar isto → Sem interface gráfica, SSH, ou remoto. Onde a tua CLI reside num sítio a que um navegador não consegue aceder. O utilizador faz o login do portátil enquanto a tua CLI aguarda em background.
device-code.ts
1import { createCliAuth, keyringStorage } from 'cli-auth';2import { Entry } from '@napi-rs/keyring';3 4const auth = createCliAuth({5  strategy: 'device-code',6  provider: {7    metadata: {8      deviceAuthorizationEndpoint: 'https://your-tenant.logto.app/oidc/device/auth',9      tokenEndpoint: 'https://your-tenant.logto.app/oidc/token',10    },11  },12  clientId: 'your-cli-client',13  storage: keyringStorage({ entry: new Entry('your-cli', 'tokens') }),14  scope: 'openid offline_access',15});16 17await auth.login({18  onAuthorization: ({ userCode, verificationUri }) => {19    console.log(`Visit ${verificationUri} and enter ${userCode}`);20  },21});22 23const accessToken = await auth.getToken();

O que ninguém te diz que a auth da CLI precisa.

Cada ponto abaixo é um bug real, condição de corrida, ou cláusula da especificação que já resolvemos.

slow_down back-off
PKCE verifier + challenge
loopback on 127.0.0.1
O_CREAT | O_EXCL
atomic write + rename
cross-process lock
recheck after lock
0600 permissions
macOS Keychain
Windows Credential Store
Linux Secret Service
refresh token single-use
expiry threshold
per-resource token cache
proxy / OTel fetch hook
branded callback page
custom parameters
TypeScript discriminated unions
…and tests.
background

Troca qualquer peça. Nada é uma caixa preta.

Armazenamento, locking, fetch e a página de callback são hooks. Nada está hardcoded. Clica numa slot e vê a configuração alterar-se.

Trocar o armazenamento
macOS Keychain, Windows Credential Store ou Linux Secret Service, o que o SO fornecer. Via @napi-rs/keyring.
cli-auth.config.ts
1import { createCliAuth } from 'cli-auth';2 3const auth = createCliAuth({4  strategy: 'authorization-code',5  provider: { /* ... */ },6  clientId: 'your-cli-client',7  storage: keyringStorage({ entry: new Entry('your-cli', 'tokens') }),8});

Usa o provider de identidade que quiseres

Qualquer servidor OAuth 2.0 / OIDC compatível funciona. Aponta a biblioteca para os endpoints e ela faz o resto. Não foi feito só para o Logto.

Logto
Auth0
Okta
Keycloak
Microsoft Entra
Google
Authelia
Any OIDC 2.0 server
Logto
Auth0
Okta
Keycloak
Microsoft Entra
Google
Authelia
Any OIDC 2.0 server

Perguntas Frequentes

Em que difere do openid-client?

Funciona com Auth0, Okta ou o meu próprio provider?

Como funciona exatamente o locking entre processos?

E se o keyring do SO não estiver disponível?

Que runtimes são suportados?

Posso personalizar a página pós-login?

Desbloqueie mais com a Logto Cloud

Autenticação CLI sem teres de a escrever tu mesmo.