auth

package
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 6, 2026 License: MIT Imports: 13 Imported by: 0

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

View Source
const NomeDoCookie = "brevis_sessao"

NomeDoCookie e o do cookie de sessao.

View Source
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

func ConferirSenha(hash, senha string) bool

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 De

func De(ctx context.Context) string

De devolve o operador da requisicao, ou vazio quando nao ha sessao.

func Destino

func Destino(bruto string) string

Destino saneia o `?de=` na hora de redirecionar pos-login.

func EmContexto

func EmContexto(ctx context.Context, usuario string) context.Context

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

func GerarHash(senha string) (string, error)

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) Ativa

func (c Credencial) Ativa() bool

Ativa diz se ha credencial configurada.

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.

func (*Portao) Entrar

func (p *Portao) Entrar(w http.ResponseWriter, usuario, senha string) bool

Entrar confere a credencial e grava o cookie. Devolve false se nao bateu.

func (*Portao) Sair

func (p *Portao) Sair(w http.ResponseWriter)

Sair apaga o cookie.

func (*Portao) ServeHTTP

func (p *Portao) ServeHTTP(w http.ResponseWriter, r *http.Request)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL