Autorização e Autenticação em Go: pacotes e exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Autorização e Autenticação em Go (Golang): visão geral das ferramentas principais



Autenticação (verificação da identidade do usuário) e autorização (verificação de permissões de acesso) são componentes fundamentais de qualquer aplicação web. No ecossistema Go (Golang), existem várias bibliotecas consolidadas que permitem implementar esses mecanismos de forma rápida, segura e com o mínimo de código. Neste artigo, abordaremos quatro abordagens principais: hash de senhas, tokens JWT, gerenciamento de sessões e OAuth2.



1. Hash de senhas: golang.org/x/crypto/bcrypt

O primeiro passo de qualquer autenticação é o armazenamento seguro de senhas. Nunca armazene senhas em texto puro! O pacote bcrypt da coleção padrão do Go fornece um algoritmo de hash comprovado com custo adaptável (cost factor).



Instalação:

go get golang.org/x/crypto/bcrypt


Exemplo de registro e login:

package main

import ( "fmt" "golang.org/x/crypto/bcrypt")

func hashPassword(password string) (string, error) { bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) return string(bytes), err}

func checkPasswordHash(password, hash string) bool { err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) return err == nil}

func main() { password := "mySecretP@ssw0rd" hash, _ := hashPassword(password)

fmt.Println("Hash:", hash)

// Verificação da senha correta match := checkPasswordHash(password, hash) fmt.Println("Password match:", match) // true

// Verificação da senha incorreta match = checkPasswordHash("wrong", hash) fmt.Println("Wrong password match:", match) // false}


Importante: bcrypt.DefaultCost é igual a 10. Para um nível de segurança mais alto (mas mais lento), use o valor 12-14. Nunca use um cost menor que 10.



2. JWT (JSON Web Tokens) — github.com/golang-jwt/jwt/v5

JWT é uma forma compacta de transmitir dados entre partes na forma de um objeto JSON. É ideal para APIs REST e microsserviços. O pacote golang-jwt/jwt é o mais popular e ativamente mantido.



Instalação:

go get github.com/golang-jwt/jwt/v5


Exemplo de criação e verificação de JWT:

package main

import ( "fmt" "time" "github.com/golang-jwt/jwt/v5")

var jwtSecret = []byte("your-secret-key-keep-it-safe")

func createToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(24 * time.Hour).Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}

func verifyToken(tokenString string) (string, error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return jwtSecret, nil }) if err != nil { return "", err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims["user_id"].(string), nil } return "", fmt.Errorf("invalid token")}

func main() { token, _ := createToken("user123") fmt.Println("JWT:", token)

userID, err := verifyToken(token) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Authenticated user:", userID) }}


Dica: Armazene a chave secreta em variáveis de ambiente, não no código. Para produção, use criptografia assimétrica (RS256).



3. Gerenciamento de sessões — gorilla/sessions

Para aplicações web clássicas com templates HTML, fre

Recommendations