Introdução: por que OAuth 2.0 e JWT em Go?
O desenvolvimento web moderno é impensável sem autenticação e autorização seguras. Se você está escrevendo sua primeira API, microsserviço ou aplicação web em Go (Golang), mais cedo ou mais tarde enfrentará a necessidade de proteger os dados dos usuários. Dois padrões — OAuth 2.0 e JWT (JSON Web Token) — tornaram-se o padrão ouro nesta área.
Neste artigo, vamos analisar como funcionam OAuth 2.0 e JWT, e escrever uma implementação simples, mas funcional, em Go. Você aprenderá como emitir tokens de acesso, verificá-los e proteger seus endpoints. O artigo é voltado para desenvolvedores iniciantes familiarizados com os fundamentos de Go e HTTP.
O que são OAuth 2.0 e JWT? Em palavras simples
OAuth 2.0 — protocolo de acesso delegado
OAuth 2.0 não é uma biblioteca nem uma função, mas um protocolo. Imagine que você queira fazer login em um site através do Google. OAuth 2.0 permite que o site obtenha do Google acesso limitado aos seus dados (por exemplo, email) sem que você precise fornecer sua senha do Google. Isso é chamado de "acesso delegado".
Principais papéis no OAuth 2.0:
- Resource Owner — o usuário (você).
- Client — a aplicação que deseja obter acesso (nosso site).
- Authorization Server — o servidor que emite tokens (Google).
- Resource Server — o servidor com os dados do usuário (API do Google).
JWT — formato de token
JWT (JSON Web Token) é uma forma compacta e autossuficiente de transmitir informações entre partes na forma de um objeto JSON. Ele consiste em três partes separadas por pontos:
- Header — tipo de token e algoritmo de assinatura (ex.: HS256).
- Payload — dados (claims): ID do usuário, papel, prazo de validade.
- Signature — assinatura que garante que o token não foi alterado.
JWT é frequentemente usado como Access Token no OAuth 2.0. O servidor assina o token com uma chave secreta, e o cliente o envia no cabeçalho Authorization: Bearer <token>.
Prática: implementação de autorização JWT em Go
Vamos escrever um pequeno servidor HTTP em Go que emitirá tokens JWT e os verificará em rotas protegidas. Para trabalhar com JWT, usaremos a biblioteca popular github.com/golang-jwt/jwt/v5.
Passo 1: Instalação de dependências e estrutura do projeto
Crie um novo módulo e instale a biblioteca:
go mod init auth-examplego get github.com/golang-jwt/jwt/v5go get golang.org/x/cryptoA estrutura de arquivos será simples:
main.go— ponto de entrada e rotas.auth.go— lógica de criação e verificação de JWT.handlers.go— manipuladores HTTP.
Passo 2: Criação do token JWT
Criaremos o arquivo auth.go. Aqui definiremos a chave secreta (em um projeto real, armazene-a em .env) e uma função para gerar o token.
package main
import ( "time" "github.com/golang-jwt/jwt/v5")
var jwtSecret = []byte("your-secret-key-here")
type Claims struct { UserID int `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims}
func GenerateToken(userID int, username string) (string, error) { claims := Claims{ UserID: userID, Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "auth-example", }, }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret)}\