Documentation
¶
Overview ¶
Package auth fecha a interface do Brevis com uma credencial de operador.
Existe por um motivo concreto: em dev, um `POST /workflows/<slug>/trigger` anonimo respondia 303 e disparava a pipeline. Qualquer pessoa na internet podia rodar um `dbt build` que faz MERGE no data warehouse. Uma interface de orquestracao e um controle remoto do warehouse — deixa-la aberta e o mesmo que publicar o terminal.
O escopo e deliberadamente pequeno: UMA credencial de operador, vinda da configuracao. Nao ha cadastro, papeis nem multi-usuario, porque nada disso existe no produto ainda e inventa-los aqui seria construir o andar antes da parede. O que existe precisa estar certo: hash com derivacao lenta, sessao assinada, comparacao em tempo constante.
Tudo em stdlib. `crypto/pbkdf2` entrou na biblioteca padrao no Go 1.24, o que dispensa `x/crypto` para o unico pedaco que faltava.
Index ¶
Constants ¶
const NomeDoCookie = "brevis_sessao"
NomeDoCookie e o do cookie de sessao.
const ValidadeDaSessao = 12 * time.Hour
ValidadeDaSessao e quanto tempo um login vale. Um turno de trabalho: curto o bastante para uma aba esquecida num notebook nao virar acesso permanente, longo o bastante para nao pedir senha no meio de uma investigacao.
Variables ¶
This section is empty.
Functions ¶
func ConferirSenha ¶
ConferirSenha compara a senha com o hash em tempo constante.
Devolve false — e nao erro — para hash malformado: quem chama esta num caminho de login, e a unica resposta segura ali e "nao entrou". O erro de configuracao e pego no boot, por Credencial.Validar.
func EmContexto ¶
EmContexto guarda o operador da requisicao. O layout usa isso para decidir se mostra o botao de sair — uma instalacao sem credencial nao deve exibir um botao que nao faz nada.
func GerarHash ¶
GerarHash produz o texto que vai na configuracao, no formato `pbkdf2-sha256$<iteracoes>$<sal>$<chave>`.
O formato carrega o numero de iteracoes junto porque ele vai mudar: quando dobrarmos o custo daqui a alguns anos, hashes antigos precisam continuar conferindo. Um formato que so guarda o digest obriga a invalidar todo mundo.
Types ¶
type Credencial ¶
type Credencial struct {
Usuario string
Hash string
// Segredo assina o cookie de sessao. Trocá-lo derruba todas as sessoes,
// que e a alavanca de emergencia quando se suspeita de vazamento.
Segredo []byte
}
Credencial e o operador unico da instalacao, vindo da configuracao.
func (Credencial) Validar ¶
func (c Credencial) Validar() error
Validar recusa configuracao pela metade.
Metade configurada e pior que nada: quem preencheu o usuario acredita que fechou a porta. Falhar no boot e a unica forma de essa crenca nao durar ate o incidente.
type Portao ¶
type Portao struct {
Cred Credencial
Proximo http.Handler
Login http.Handler // renderiza a tela de login
Inseguro bool // http puro: manda o cookie sem a flag Secure
}
Portao envolve um handler exigindo sessao valida.
`Rotas` que dispensam sessao sao poucas e explicitas. Sondas do Kubernetes entram nessa lista por necessidade — um /health que pede senha derruba o pod.