auth

package
v0.3.0 Latest Latest
Warning

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

Go to latest
Published: Jul 31, 2026 License: AGPL-3.0 Imports: 9 Imported by: 0

Documentation

Overview

Package auth cuida de identidade e credenciais.

Vive separado dos handlers HTTP para que as regras de segurança sejam verificáveis sem subir servidor: bloqueio por tentativas, expiração de sessão e revogação de token são exercitados diretamente.

Index

Constants

View Source
const (
	// DefaultSessionTTL é a validade de um login na interface.
	DefaultSessionTTL = 7 * 24 * time.Hour

	// MaxLoginAttempts é quantas falhas seguidas uma conta tolera antes de
	// ser bloqueada temporariamente.
	MaxLoginAttempts = 5

	// LockoutWindow é a duração do bloqueio.
	//
	// Bloqueio temporário em vez de permanente: o permanente transformaria
	// tentativas de login erradas numa forma de negar acesso ao dono da
	// conta.
	LockoutWindow = 15 * time.Minute
)

Variables

View Source
var (
	// ErrInvalidCredentials cobre tanto senha errada quanto conta
	// inexistente. Um erro só, de propósito: distinguir os dois permitiria
	// descobrir quais contas existem antes de atacar a senha.
	ErrInvalidCredentials = errors.New("auth: credenciais inválidas")

	// ErrUnauthenticated indica sessão ou token ausente, vencido ou
	// desconhecido.
	ErrUnauthenticated = errors.New("auth: não autenticado")

	// ErrTooManyAttempts indica conta temporariamente bloqueada.
	ErrTooManyAttempts = errors.New("auth: tentativas demais; tente novamente mais tarde")

	// ErrLastAdmin recusa remover ou rebaixar o último administrador.
	//
	// Sem esta guarda, um clique deixaria a instalação sem ninguém capaz
	// de administrar, e a única saída seria mexer no banco à mão.
	ErrLastAdmin = errors.New("auth: é preciso manter ao menos um administrador")

	// ErrSetupComplete indica que o assistente de primeiro acesso já foi
	// usado.
	ErrSetupComplete = errors.New("auth: a instalação já possui uma conta")
)

Functions

This section is empty.

Types

type Options

type Options struct {
	SessionTTL time.Duration
	Clock      clock.Clock
}

Options configura o serviço. Campos zerados assumem o padrão.

type Service

type Service struct {
	// contains filtered or unexported fields
}

Service reúne as operações de identidade.

func New

func New(s store.MetadataStore, opts Options) *Service

New cria o serviço de autenticação.

func (*Service) AuthenticateSession

func (s *Service) AuthenticateSession(ctx context.Context, secret string) (domain.User, error)

AuthenticateSession resolve o segredo do cookie na conta correspondente.

func (*Service) AuthenticateToken

func (s *Service) AuthenticateToken(ctx context.Context, secret string) (domain.User, error)

AuthenticateToken resolve um segredo de API na conta dona.

func (*Service) ChangePassword

func (s *Service) ChangePassword(ctx context.Context, userID int64, current, next string) error

ChangePassword troca a senha e encerra as sessões abertas.

Derrubar as sessões é parte do propósito: trocar a senha porque ela pode ter vazado não adianta se quem a obteve continuar logado.

func (*Service) CreateInitialAdmin

func (s *Service) CreateInitialAdmin(ctx context.Context, username, password string) (domain.User, error)

CreateInitialAdmin cria a primeira conta.

Só funciona enquanto não existir nenhuma: o assistente não é autenticado, e mantê-lo disponível deixaria qualquer visitante criar uma conta e tomar a instalação.

func (*Service) CreateUser

func (s *Service) CreateUser(ctx context.Context, username, password string, role domain.Role) (domain.User, error)

CreateUser cadastra uma conta com o papel indicado.

Separado de CreateInitialAdmin de propósito: aquele é o assistente de primeiro acesso e recusa a segunda chamada; este exige que já exista alguém administrando, e é chamado por essa pessoa.

func (*Service) DeleteUser

func (s *Service) DeleteUser(ctx context.Context, id int64) error

DeleteUser remove a conta, recusando o último administrador.

func (*Service) IssueToken

func (s *Service) IssueToken(
	ctx context.Context,
	userID int64,
	name string,
	expiresAt *time.Time,
) (domain.APIToken, string, error)

IssueToken cria uma credencial programática e devolve o segredo.

O segredo só existe neste retorno: depois disso apenas o hash permanece, e nem o operador consegue recuperá-lo.

func (*Service) ListTokens

func (s *Service) ListTokens(ctx context.Context, userID int64) ([]domain.APIToken, error)

ListTokens devolve os tokens da conta.

func (*Service) Login

func (s *Service) Login(ctx context.Context, username, password string) (string, error)

Login confere as credenciais e abre uma sessão, devolvendo o segredo que vai no cookie.

func (*Service) Logout

func (s *Service) Logout(ctx context.Context, secret string) error

Logout encerra a sessão.

func (*Service) NeedsSetup

func (s *Service) NeedsSetup(ctx context.Context) (bool, error)

NeedsSetup informa se a instalação ainda não tem conta.

func (*Service) RevokeToken

func (s *Service) RevokeToken(ctx context.Context, userID, tokenID int64) error

RevokeToken apaga um token da própria conta.

A checagem de dono impede que uma conta revogue credencial de outra, o que seria escalonamento de privilégio assim que houver mais de uma.

func (*Service) SetRole

func (s *Service) SetRole(ctx context.Context, id int64, role domain.Role) (domain.User, error)

SetRole troca o papel de uma conta.

Recusa rebaixar o último administrador. Sem esta guarda, um clique deixaria a instalação sem ninguém capaz de criar contas, cadastrar alvos ou publicar página — e a única saída seria mexer no banco à mão.

func (*Service) SweepExpiredSessions

func (s *Service) SweepExpiredSessions(ctx context.Context) (int64, error)

SweepExpiredSessions remove as sessões vencidas.

Jump to

Keyboard shortcuts

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