Autorização e Autenticação em Go (Golang)
No desenvolvimento web moderno com Go (Golang), a segurança dos dados do usuário e o controle de acesso são aspectos criticamente importantes. Bibliotecas e ferramentas para autorização e autenticação permitem que desenvolvedores implementem proteção em suas aplicações de forma rápida e confiável. Neste artigo, abordaremos as principais abordagens e bibliotecas populares para implementar autenticação (verificação da identidade do usuário) e autorização (definição de permissões de acesso) em Go.
Conceitos Principais
Antes de passar para as ferramentas, é importante distinguir dois conceitos-chave:
- Autenticação — processo de verificar se o usuário é quem diz ser (geralmente através de login/senha, tokens, OAuth).
- Autorização — processo de determinar quais recursos e ações estão disponíveis para um usuário autenticado (papéis, permissões de acesso).
Bibliotecas e Ferramentas Populares
1. bcrypt para hash de senhas
A biblioteca golang.org/x/crypto/bcrypt é o padrão de facto para armazenamento seguro de senhas. Ela adiciona automaticamente um salt e usa uma função de hash adaptativa.
package main
import ( "fmt" "golang.org/x/crypto/bcrypt")
func main() { password := "mySecretPassword123" // Hash da senha hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { panic(err) } fmt.Printf("Hash: %s", hash) // Verificação da senha err = bcrypt.CompareHashAndPassword(hash, []byte("wrongPassword")) if err != nil { fmt.Println("Senha incorreta:", err) } else { fmt.Println("Senha correta") } // Verificação bem-sucedida err = bcrypt.CompareHashAndPassword(hash, []byte(password)) if err == nil { fmt.Println("Senha correta!") }}2. JWT (JSON Web Tokens) com a biblioteca golang-jwt
A biblioteca github.com/golang-jwt/jwt/v5 permite criar e verificar tokens JWT. Esta é uma forma popular de implementar autenticação stateless.
package main
import ( "fmt" "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("super-secret-key")
func createToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(time.Hour * 24).Unix(), "iat": time.Now().Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}
func validateToken(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("método de assinatura inesperado: %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("token inválido")}
func main() { // Criação do token token, _ := createToken("user123") fmt.Println("JWT Token:", token) // Verificação do token userID, err := validateToken(token) if err != nil { fmt.Println("Erro de validação:", err) } else { fmt.Println("User ID do token:", userID) }}3. Autenticação baseada em sessão com gorilla/sessions
Para autenticação tradicional por sessão, use github.com/gorilla/sessions. As sessões são armazenadas no servidor, e apenas um cookie com o ID da sessão é enviado ao cliente.
package main
import ( "net/http" "github.com/gorilla/sessions")\ Também na biblioteca
Monitoramento de aplicações Rust: biblioteca tracing e métricas
Uso de GraphQL em Swift: bibliotecas Apollo e Relay para iOS/macOS
Configuração de aplicações JavaScript (Node.js): bibliotecas dotenv, convict, nconf
Trabalhando com Excel em PHP: bibliotecas PhpSpreadsheet e OpenSpout