Autorização e Autenticação em Go (Golang)
A segurança de aplicações web em Go começa com a implementação correta dos mecanismos de autenticação (verificação de "quem é você") e autorização (verificação de "o que você pode fazer"). Neste artigo, abordaremos três abordagens principais: JWT (JSON Web Tokens), OAuth2 e autenticação por sessão. Cada uma delas tem seus cenários de uso, vantagens e desvantagens.
1. Autenticação com JWT (JSON Web Token)
JWT é uma forma compacta e autossuficiente de transmitir informações entre partes na forma de um objeto JSON. Em Go, a biblioteca mais usada para trabalhar com JWT é github.com/golang-jwt/jwt/v5.
Instalação:
go get github.com/golang-jwt/jwt/v5Exemplo de criação e validação de JWT:
package main
import (\t"fmt"\t"time"\t"github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("my_secret_key")
// Criação do tokenfunc createToken(userID string) (string, error) {\tclaims := jwt.MapClaims{\t\t"user_id": userID,\t\t"exp": time.Now().Add(24 * time.Hour).Unix(),\t}\ttoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\treturn token.SignedString(jwtSecret)}
// Validação do tokenfunc validateToken(tokenString string) (string, error) {\ttoken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\t\tif _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\t\t\treturn nil, fmt.Errorf("método de assinatura inválido")\t\t}\t\treturn jwtSecret, nil\t})
\tif err != nil {\t\treturn "", err\t}
\tif claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {\t\treturn claims["user_id"].(string), nil\t}\treturn "", fmt.Errorf("token inválido")}
func main() {\ttoken, _ := createToken("user123")\tfmt.Println("Token:", token)
\tuserID, err := validateToken(token)\tif err != nil {\t\tfmt.Println("Erro:", err)\t} else {\t\tfmt.Println("Usuário:", userID)\t}}2. Autenticação via OAuth2
OAuth2 é um protocolo de acesso delegado que permite que usuários façam login através de serviços terceiros (Google, GitHub, VK, etc.). Em Go, a biblioteca popular é golang.org/x/oauth2.
Instalação:
go get golang.org/x/oauth2Exemplo de OAuth2 com Google:
package main
import (\t"context"\t"encoding/json"\t"fmt"\t"net/http"\t"golang.org/x/oauth2"\t"golang.org/x/oauth2/google")
var googleOauthConfig = &oauth2.Config{\tRedirectURL: "http://localhost:8080/callback",\tClientID: "your-client-id",\tClientSecret: "your-client-secret",\tScopes: []string{"https://www.googleapis.com/auth/userinfo.email"},\tEndpoint: google.Endpoint,}
func handleGoogleLogin(w http.ResponseWriter, r *http.Request) {\turl := googleOauthConfig.AuthCodeURL("state-token")\thttp.Redirect(w, r, url, http.StatusTemporaryRedirect)}
func handleCallback(w http.ResponseWriter, r *http.Request) {\tcode := r.URL.Query().Get("code")\ttoken, err := googleOauthConfig.Exchange(context.Background(), code)\tif err != nil {\t\thttp.Error(w, "Erro na troca do token", http.StatusInternalServerError)\t\treturn\t}
\t// Obtendo dados do usuário\tclient := googleOauthConfig.Client(context.Background(), token)\tresp, _ := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")\tdefer resp.Body.Close()
\tvar userInfo map[string]interface{}\tjson.NewDecoder(resp.Body).Decode(&userInfo)\tfmt.Fprintf(w, "Email: %v", userInfo["email"])}
func main() {\thttp.HandleFunc("/auth/google", handleGoogleLogin)\thttp.HandleFunc("/callback", handleCallback)\thttp.ListenAndServe(":8080", nil)}3. Autenticação por Sessão
Abordagem clássica usando cookies e sessões no servidor. Em Go, é frequentemente usada
Também na biblioteca
Integração de métricas Prometheus em C++: biblioteca prometheus-cpp
Internacionalização (i18n) em C++: guia completo com gettext e ICU
Envio de email em Go (Golang): bibliotecas e exemplos de código
Configuração de aplicações Rust: bibliotecas config, envy e dotenvy
Trabalhando com CSV em JavaScript (Node.js): bibliotecas, parsing e geração de dados