Métodos de Autenticação
| Método | Descrição | Quando Usar |
|---|---|---|
| Chave de API | Variável de ambiente no .env (ex: OPENAI_API_KEY) | Acesso programático, CI/CD, API Keys da plataforma |
| OAuth (login interativo) | Comando /auth login no terminal | Planos ChatGPT Plus/Codex, Claude Pro, sem gerenciar keys |
- Com suporte a OAuth: OpenAI (ChatGPT Plus/Codex), Anthropic (Claude Pro) e GitHub Copilot (Device Flow).
- Apenas chave de API: GoogleAI, xAI, ZAI, MiniMax, Moonshot (Kimi), StackSpot e Ollama. Para esses provedores, configure a chave via variável de ambiente no
.envou use/auth set.
Comandos /auth
Todos os comandos de autenticação possuem auto-completação — basta digitar /auth e pressionar Tab.
Ver Status
Login via OAuth
Autorize o acesso
localhost:<porta-aleatória>/callback captura o código automaticamente. Após autorizar, o navegador é redirecionado para a página de sucesso oficial do Anthropic e o terminal completa o login. Se o servidor local não puder iniciar (porta indisponível, firewall) ou se CHATCLI_ANTHROPIC_LEGACY_OAUTH=1 estiver definido, o ChatCLI cai automaticamente no fluxo legado de copiar e colar o código.GitHub Copilot: insira o código do dispositivo exibido no terminal na página do GitHub.Provedores Suportados
| Provedor | Comando | Planos Compatíveis |
|---|---|---|
| OpenAI | /auth login openai-codex | ChatGPT Plus, Codex, Team, Enterprise |
| Anthropic | /auth login anthropic | Claude Pro, Team |
| GitHub Copilot | /auth login github-copilot | Copilot Individual, Business, Enterprise |
| GitHub Models | /auth login github-models | Qualquer conta GitHub (PAT) — detalhes |
Logout
Detalhes Técnicos dos Fluxos OAuth
Esta seção descreve como cada fluxo OAuth funciona internamente, incluindo URLs, parâmetros e comportamento do ChatCLI.Anthropic OAuth (PKCE + Callback Localhost, com fallback para paste)
O fluxo da Anthropic usa OAuth 2.0 com PKCE (Proof Key for Code Exchange) e um servidor HTTP local emlocalhost:<porta-aleatória>/callback para capturar o código de autorização — o mesmo padrão usado pelo Claude Code CLI. O fluxo legado de copiar e colar o código permanece disponível como fallback automático.
Fluxo primário (callback local)
Geração do PKCE e início do servidor local
code_verifier aleatório, calcula o code_challenge usando SHA-256 (método S256), e sobe um servidor HTTP em uma porta aleatória de localhost. Um state de 32 bytes (base64url, 43 caracteres) é gerado para proteção CSRF.Abertura do navegador
code=true, o PKCE challenge, o state e o redirect_uri apontando para o servidor local.Usuário autoriza no navegador
http://localhost:<porta>/callback?code=...&state=....Fluxo de fallback (copiar e colar)
Acionado automaticamente quando o servidor local não consegue se vincular à porta (firewall, porta em uso) ou quandoCHATCLI_ANTHROPIC_LEGACY_OAUTH=1 é definido explicitamente.
Abertura do navegador no fluxo legado
console.anthropic.com como redirect_uri).Usuário copia o código
código#state. O usuário cola o texto completo no terminal — o ChatCLI separa código e state automaticamente.| Parâmetro | Valor |
|---|---|
| Auth URL (primário) | https://claude.com/cai/oauth/authorize |
| Auth URL (fallback) | https://claude.ai/oauth/authorize |
| Token URL (primário) | https://platform.claude.com/v1/oauth/token |
| Token URL (fallback) | https://console.anthropic.com/v1/oauth/token |
| Redirect URI (primário) | http://localhost:<porta-aleatória>/callback |
| Redirect URI (fallback) | https://console.anthropic.com/oauth/code/callback |
| Página de sucesso | https://platform.claude.com/oauth/code/success?app=claude-code |
| Client ID | 9d1c250a-e61b-44d9-88ed-5944d1962f5e |
| Scopes | org:create_api_key user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload |
| PKCE Method | S256 (SHA-256 code challenge) |
Tamanho do state | 32 bytes (base64url, 43 caracteres) |
platform.claude.com e cai automaticamente para console.anthropic.com/v1/oauth/token se o token tiver sido emitido pelo fluxo legado de paste.
OpenAI Codex OAuth (PKCE + Callback Localhost)
O fluxo da OpenAI usa OAuth 2.0 com PKCE e um servidor HTTP local para capturar o callback automaticamente.Servidor local inicia na porta 1455
http://localhost:1455 para receber o callback OAuth.Navegador abre na página de autorização
state para validação CSRF.Usuário autoriza no navegador
http://localhost:1455/auth/callback com o código de autorização.| Parâmetro | Valor |
|---|---|
| Auth URL | https://auth.openai.com/oauth/authorize |
| Token URL | https://auth.openai.com/oauth/token |
| Redirect URI | http://localhost:1455/auth/callback |
| Client ID | app_EMoamEEZ73f0CkXaXp7hrann (sobrescrevível via CHATCLI_OPENAI_CLIENT_ID) |
| Scopes | openid profile email offline_access |
| PKCE Method | S256 |
GitHub Copilot Device Flow (RFC 8628)
O GitHub Copilot usa o Device Authorization Grant (RFC 8628), um fluxo projetado para dispositivos sem navegador integrado, como terminais CLI.Exibição do código no terminal
user_code e a URL de verificação (https://github.com/login/device) para o usuário.Usuário autoriza no navegador
user_code e autoriza o acesso do ChatCLI.| Parâmetro | Valor |
|---|---|
| Device Code URL | https://github.com/login/device/code |
| Token Polling URL | https://github.com/login/oauth/access_token |
| Client ID | Ov23lifEydOk2Non90tJ (sobrescrevível via CHATCLI_COPILOT_CLIENT_ID) |
| Scope | read:user |
| Timeout máximo | 15 minutos |
| Resposta | Ação |
|---|---|
authorization_pending | Continua polling normalmente |
slow_down | Aumenta o intervalo em +5 segundos |
expired_token | Falha — o device code expirou |
access_denied | Falha — o usuário negou acesso |
Fluxo Completo: Do Zero ao Primeiro Prompt
Se você está começando sem nenhuma credencial configurada, siga estes passos:Roteamento Automático de Endpoints (OpenAI)
O ChatCLI detecta automaticamente o tipo de credencial e roteia as requisições para o endpoint correto:| Credencial | Endpoint | API Format |
|---|---|---|
OPENAI_API_KEY | api.openai.com/v1/responses | Responses API (padrão) |
OPENAI_API_KEY | api.openai.com/v1/chat/completions | Chat Completions (modelos legados) |
OAuth (/auth login) | chatgpt.com/backend-api/codex/responses | Responses API (streaming SSE) |
Armazenamento de Credenciais
As credenciais OAuth são salvas com criptografia AES-256-GCM em:Detalhes de Criptografia
| Aspecto | Detalhe |
|---|---|
| Algoritmo | AES-256-GCM (authenticated encryption) |
| Arquivo da chave | ~/.chatcli/.auth-key (32 bytes aleatórios) |
| Permissão da chave | 0o600 (somente leitura/escrita pelo dono) |
| Formato criptografado | chatcli-enc:v1: + Base64(nonce + ciphertext) |
| Geração da chave | Automática na primeira utilização |
~/.chatcli/.auth-key. Dados não-criptografados de versões anteriores são detectados automaticamente (ausência do prefixo chatcli-enc:v1:) e migrados para o formato criptografado na próxima gravação.
Cada perfil armazenado contém:
- Access token (criptografado)
- Refresh token (criptografado, quando aplicável)
- Expiry (timestamp em milissegundos)
- Account ID e email do provedor
- Tipo de provedor (anthropic, openai-codex, github-copilot)
Validação de Tokens
O ChatCLI implementa validação rigorosa de tokens OAuth para prevenir uso de credenciais inválidas ou expiradas:Validação de Access Token
- Rejeição de tokens vazios — Tokens com access token vazio são rejeitados imediatamente, sem tentar fazer requests. Isso previne erros confusos de “unauthorized” quando as credenciais estão corrompidas.
- Validação de expiração — O campo
expiryé verificado antes de cada request. Tokens expirados disparam o fluxo de refresh automaticamente.
Tempo de Vida Máximo de Token (CHATCLI_MAX_TOKEN_LIFETIME)
Para ambientes de produção com requisitos de conformidade, você pode limitar o tempo de vida máximo de tokens:/auth login. Isso garante rotação periódica de credenciais mesmo quando o refresh token ainda é válido.| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_MAX_TOKEN_LIFETIME | Tempo de vida máximo de tokens OAuth/JWT. Aceita durações Go (ex: 24h, 168h). | 720h (30 dias) |
Renovação Automática de Tokens
O ChatCLI renova tokens expirados automaticamente em duas camadas:Renovação Proativa
IsExpired()) ou prestes a expirar (IsExpiringSoon() com margem de 5 minutos). Se sim, o refresh é executado antes do request.Renovação Reativa
Sincronização com CLIs Externos
O ChatCLI pode importar credenciais de CLIs externos viaSyncExternalCliCreds():
| CLI Externo | Caminhos Verificados | Perfil Importado |
|---|---|---|
| Claude Code | ~/.claude/credentials.json ou ~/.claude.json | anthropic-oauth-sync |
| OpenAI Codex CLI | ~/.codex/credentials.json ou ~/.codex/auth.json | openai-codex-sync |
Prioridade de Resolução de Credenciais
Ao determinar qual credencial usar para um provedor, o ChatCLI segue está ordem de prioridade:Auth-profiles store (OAuth/Token)
auth-profiles.json, incluindo perfis sincronizados de CLIs externos. O refresh automático é aplicado nesta camada.| Prefixo | Significado |
|---|---|
oauth: | Token obtido via fluxo OAuth |
apikey: | Chave de API tradicional |
token: | Token genérico (ex: Copilot) |
Configuração Avançada
| Variável | Descrição |
|---|---|
CHATCLI_OPENAI_CLIENT_ID | Permite sobrescrever o client ID do OAuth da OpenAI |
CHATCLI_COPILOT_CLIENT_ID | Permite sobrescrever o client ID do Device Flow do GitHub Copilot (padrão: Ov23lifEydOk2Non90tJ) |
COPILOT_API_BASE_URL | URL base da API do Copilot para ambientes enterprise (padrão: https://api.githubcopilot.com) |
CHATCLI_ANTHROPIC_LEGACY_OAUTH | Quando definido como 1, força o fluxo legado de copiar e colar o código no /auth login anthropic, ignorando o callback local. Útil em ambientes onde o localhost não é acessível (containers, SSH sem port-forward, firewall restritivo). |
Solução de Problemas
Erro de autenticação ao clicar no link OAuth (OpenAI)
Erro de autenticação ao clicar no link OAuth (OpenAI)
Anthropic: callback local não funciona ou navegador trava em localhost
Anthropic: callback local não funciona ou navegador trava em localhost
Anthropic: página de autorização retorna "Invalid request format"
Anthropic: página de autorização retorna "Invalid request format"
claude.ai valida silenciosamente três parâmetros do fluxo primário e retorna apenas “Invalid request format” se algum estiver errado:code=trueausente na query stringstatecom tamanho diferente de 32 bytes (43 caracteres base64url)- URL de autorização diferente de
claude.com/cai/oauth/authorize
loginAnthropicLocalhost, verifique esses três pontos antes de qualquer outra coisa.Anthropic: erro 403 ou conexão recusada na troca de tokens
Anthropic: erro 403 ou conexão recusada na troca de tokens
http.Client puro para a troca de tokens da Anthropic, evitando fingerprinting TLS pelo Cloudflare. Se você estiver desenvolvendo, certifique-se de que a função exchangeAnthropicToken usa um client sem transporte customizado.Provedor não aparece no /switch após login
Provedor não aparece no /switch após login
/auth status para verificar se o token foi salvo corretamente. Se necessário, tente /auth logout <provedor> seguido de /auth login <provedor>.GitHub Copilot: authorization denied by user
GitHub Copilot: authorization denied by user
GitHub Copilot: device code expirado
GitHub Copilot: device code expirado
/auth login github-copilot novamente para gerar um novo código.Token expirado
Token expirado
- Proativamente: ao resolver credenciais, se o token estiver expirado ou dentro da margem de 5 minutos, o refresh é tentado antes do request.
- Reativamente: se um request retornar erro 401, o ChatCLI invalida o cache de credenciais, tenta renovar o token OAuth, recria o cliente e retenta o request automaticamente.
/auth login.Tokens do GitHub Copilot (Device Flow) não expiram e não possuem refresh token — são persistentes até revogação manual.