Tokens JWT em Go (Golang): criação e verificação com exemplos

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

Tokens JWT em Go (Golang): guia completo

\n\n

JSON Web Tokens (JWT) é um padrão aberto (RFC 7519) para criar tokens de acesso baseados em JSON. JWT é amplamente utilizado para autenticação e troca de informações entre cliente e servidor. Na linguagem Go (Golang), trabalhar com tokens JWT é simples e eficiente graças à biblioteca golang-jwt/jwt.

\n\n

Neste artigo, abordaremos detalhadamente a criação, assinatura, verificação e uso de tokens JWT em Go. O material será útil tanto para iniciantes quanto para desenvolvedores experientes que desejam implementar autenticação segura em seus projetos em Golang.

\n\n

Instalação da biblioteca golang-jwt

\n\n

Para trabalhar com JWT em Go, use o pacote github.com/golang-jwt/jwt/v5. Instale-o com o comando:

\n\n
go get github.com/golang-jwt/jwt/v5
\n\n

Após a instalação, você pode importar o pacote no seu código:

\n\n
import (\n    "github.com/golang-jwt/jwt/v5"\n)
\n\n

Estrutura do token JWT

\n\n

Um token JWT consiste em três partes separadas por pontos:

\n\n
    \n
  • Header (cabeçalho) — contém o tipo do token (JWT) e o algoritmo de assinatura (por exemplo, HS256 ou RS256).
  • \n
  • Payload (carga útil) — contém os dados (claims), como ID do usuário, função, prazo de validade, etc.
  • \n
  • Signature (assinatura) — é criada com base no header e payload usando uma chave secreta ou um par de chaves RSA/ECDSA.
  • \n
\n\n

Criação de um token JWT em Go

\n\n

Vamos ver um exemplo de criação de um token JWT com o algoritmo HMAC-SHA256 (HS256). Para isso, você precisará de uma chave secreta.

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n    // Chave secreta (deve ser armazenada em local seguro)\n    secretKey := []byte("my_secret_key_12345")\n\n    // Criando os claims (declarações)\n    claims := jwt.MapClaims{\n        "user_id": 123,\n        "role":    "admin",\n        "exp":     time.Now().Add(time.Hour * 24).Unix(), // token válido por 24 horas\n        "iat":     time.Now().Unix(),\n    }\n\n    // Criando o token\n    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n\n    // Assinando o token com a chave secreta\n    tokenString, err := token.SignedString(secretKey)\n    if err != nil {\n        fmt.Println("Erro ao criar token:", err)\n        return\n    }\n\n    fmt.Println("Token JWT criado:")\n    fmt.Println(tokenString)\n}
\n\n

Verificação e análise de um token JWT

\n\n

Para verificar a autenticidade do token, use a mesma chave secreta. É importante verificar o prazo de validade e a assinatura.

\n\n
package main\n\nimport (\n    "fmt"\n    "github.com/golang-jwt/jwt/v5"\n)\n\nfunc main() {\n    tokenString := "seu_token_aqui"\n    secretKey := []byte("my_secret_key_12345")\n\n    // Analisando e verificando o token\n    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\n        // Verificando o algoritmo de assinatura\n        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\n            return nil, fmt.Errorf("método de assinatura inesperado: %v", token.Header["alg"])\n        }\n        return secretKey, nil\n    })\n\n    if err != nil {\n        fmt.Println("Erro ao verificar token:", err)\n        return\n    }\n\n    // Extraindo os claims\n    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {\n        fmt.Println("Token válido!")\n        fmt.Printf("User ID: %v\\n", claims["user_id"])\n        fmt.Printf("Role: %v\\n", claims["role"])\n    } else {\n        fmt.Println("Token inválido")\n    }\n}
\n\n

Usando claims estruturados

\n\n

Para maior conveniência, você pode definir sua própria estrutura de claims, implementando a interface jwt.Claims:

\n\n
type CustomClaims struct {\n    UserID int    `json:"user_id"`\n    Role   string `json:"role"`\n    jwt.RegisteredCl                    

Recommendations