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
- Variables
- type Options
- type Service
- func (s *Service) AuthenticateSession(ctx context.Context, secret string) (domain.User, error)
- func (s *Service) AuthenticateToken(ctx context.Context, secret string) (domain.User, error)
- func (s *Service) ChangePassword(ctx context.Context, userID int64, current, next string) error
- func (s *Service) CreateInitialAdmin(ctx context.Context, username, password string) (domain.User, error)
- func (s *Service) CreateUser(ctx context.Context, username, password string, role domain.Role) (domain.User, error)
- func (s *Service) DeleteUser(ctx context.Context, id int64) error
- func (s *Service) IssueToken(ctx context.Context, userID int64, name string, expiresAt *time.Time) (domain.APIToken, string, error)
- func (s *Service) ListTokens(ctx context.Context, userID int64) ([]domain.APIToken, error)
- func (s *Service) Login(ctx context.Context, username, password string) (string, error)
- func (s *Service) Logout(ctx context.Context, secret string) error
- func (s *Service) NeedsSetup(ctx context.Context) (bool, error)
- func (s *Service) RevokeToken(ctx context.Context, userID, tokenID int64) error
- func (s *Service) SetRole(ctx context.Context, id int64, role domain.Role) (domain.User, error)
- func (s *Service) SweepExpiredSessions(ctx context.Context) (int64, error)
Constants ¶
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 ¶
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 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 ¶
AuthenticateSession resolve o segredo do cookie na conta correspondente.
func (*Service) AuthenticateToken ¶
AuthenticateToken resolve um segredo de API na conta dona.
func (*Service) ChangePassword ¶
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 ¶
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 ¶
ListTokens devolve os tokens da conta.
func (*Service) Login ¶
Login confere as credenciais e abre uma sessão, devolvendo o segredo que vai no cookie.
func (*Service) NeedsSetup ¶
NeedsSetup informa se a instalação ainda não tem conta.
func (*Service) RevokeToken ¶
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.