runner tokens
Gerencia tokens GitHub registrados nas apps. Tokens NUNCA são mostrados em plaintext — apenas fingerprints. Disponivel a partir da v2.13.0.
Sintaxe
runner tokens list [--json]
runner tokens test <app> [--json]E no runner add:
runner add --repo <r> --branch <b> --token-from <APP>`runner tokens list`
Enumera tokens registrados, agrupados por fingerprint. Apps que compartilham token aparecem juntas no mesmo grupo.
Output humano
Tokens (2):
--------------------------------------------------------------------------------
tk_a1b2…c3d4 | 3 app(s) | app1, app2, app3
tk_e5f6…g7h8 | 1 app(s) | app4Output JSON
{
"count": 2,
"tokens": [
{
"fingerprint": "tk_a1b2…c3d4",
"apps_count": 3,
"apps": ["app1", "app2", "app3"]
},
{
"fingerprint": "tk_e5f6…g7h8",
"apps_count": 1,
"apps": ["app4"]
}
]
}Contrato de seguranca
- Tokens em plaintext nunca aparecem no output (qualquer formato)
- Apenas o fingerprint sha256 (12 chars hex, formato
tk_4hex…4hex) eh exibido - A lista eh derivada lendo cada state file e descriptografando localmente — sem trafego de rede
`runner tokens test `
Valida o token de uma app via GitHub API (GET /user):
runner tokens test app1
# Token VALID for app1:
# Fingerprint: tk_a1b2…c3d4
# Username: devborlot
# Scopes: repo, workflowOutput JSON
{
"valid": true,
"app": "app1",
"fingerprint": "tk_a1b2…c3d4",
"username": "devborlot",
"scopes": ["repo", "workflow"]
}Erros
| Cenario | Comportamento |
|---|---|
| App nao tem token configurado | Exit 1, erro no_token_configured |
| Token revogado/invalido | Exit 1, output JSON com "valid": false, http_status, error |
| Erro de rede | Exit 1, mensagem do reqwest |
Como o teste funciona
- Carrega
state.github_token(encriptado) - Decrypt com mkey atual
- Calcula fingerprint pra mostrar
- Faz
GET https://api.github.com/usercomAuthorization: Bearer <token> - Le
x-oauth-scopesdo response header
O token plaintext nao aparece em nenhum log/output.
`runner add --token-from `
Reusa o token de outra app ja registrada. Util quando varias apps usam o mesmo token (ex: todas as repos da mesma org).
# Primeiro registro
runner add --repo devborlot/app1 --branch main --token ghp_xxx --ckey
# Reusing token from 'app1' (fingerprint: tk_a1b2…c3d4)
# Apps subsequentes — sem precisar do plaintext do token
runner add --repo devborlot/app2 --branch main --token-from app1
runner add --repo devborlot/app3 --branch main --token-from app1Comportamento
- Mutuamente exclusivo com
--token(clap rejeita ambos) - Decrypt local da mkey + re-encrypt pra nova app, plaintext nunca persiste fora do state file
- Fingerprint mostrado em stderr pra confirmacao visual
- Falha com
token_source_not_foundoutoken_source_no_tokense a app fonte nao existe ou nao tem token
Erros
| Erro | Causa |
|---|---|
token_source_not_found |
App fonte nao existe no state dir |
token_source_no_token |
App fonte existe mas nao tem state.github_token |
Conflict com --token |
Clap erro: "argument '--token' cannot be used with '--token-from'" |
Quando usar
| Cenario | Comando recomendado |
|---|---|
| Identificar quantos tokens distintos estao em uso | runner tokens list |
| Auditar quais apps compartilham um token | runner tokens list --json |
| Verificar se um token ainda eh valido | runner tokens test <app> |
| Registrar nova app reusando token existente | runner add --token-from <other-app> |
| Rotacionar um token compartilhado | (manual) gerar novo, runner edit --token em cada app |
Veja Tambem
- runner add — registrar app
- runner edit — atualizar token de uma app existente
- Secrets e Encriptacao — duas-camadas (mkey + ckey)
By Borlot.com.br on 05/05/2026