Autorização e Autenticação em Go (Golang): JWT, OAuth2 e Sessões

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)



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/v5


Exemplo 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/oauth2


Exemplo 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

Recommendations