Métodos de Autenticação
- 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
Navegador abre automaticamente
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.Provedor disponível imediatamente
/switch — sem reiniciar o app.Provedores Suportados
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=....Validação CSRF e troca de tokens
state recebido contra o gerado, troca o código por tokens via platform.claude.com/v1/oauth/token e encerra o servidor. O navegador é redirecionado para a página de sucesso oficial do Anthropic (platform.claude.com/oauth/code/success).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.Troca do código por tokens
state e code_verifier para o endpoint de tokens e recebe access_token + refresh_token.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.Validação CSRF e troca de tokens
state contra o valor gerado originalmente (proteção CSRF), troca o código por tokens e encerra o servidor.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.Requisição do device code
device_code e um user_code ao endpoint do GitHub.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.Polling até autorização
Fluxo Completo: Do Zero ao Primeiro Prompt
Se você está começando sem nenhuma credencial configurada, siga estes passos:Inicie o ChatCLI
Faça login via OAuth
Autorize no navegador
Troque para o provedor
Envie seu primeiro prompt
Roteamento Automático de Endpoints (OpenAI)
O ChatCLI detecta automaticamente o tipo de credencial e roteia as requisições para o endpoint correto:originator mais um User-Agent do Codex). Slugs de modelos mais novos — como a família GPT-5.6 (gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna) — só são servidos quando os dois headers estão presentes; sem eles o backend responde 404 Model not found (o Luna, por exemplo, não tem fallback do lado do servidor).Armazenamento de Credenciais
As credenciais OAuth são salvas com criptografia AES-256-GCM em:Detalhes de Criptografia
~/.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.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():
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.Variáveis de ambiente
ANTHROPIC_OAUTH_TOKEN, ANTHROPIC_API_KEY, OPENAI_API_KEY e GITHUB_COPILOT_TOKEN.Configuração Avançada
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: 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: 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.