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/bcryptExemplo 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/v5Exemplo 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
Também na biblioteca
Trabalho com datas em Go (Golang): bibliotecas time, carbon e now
NaturalLanguage para Swift: guia completo com exemplos
Envio de email em Java: guia completo sobre JavaMail e Jakarta Mail
Trabalho com datas em Swift: Foundation, SwiftDate, DateTools (iOS/macOS)
Geração de QR Codes em PHP: biblioteca phpqrcode e guia completo