Tokens JWT em Go (Golang): guia completo
\n\nJSON 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.
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\nInstalação da biblioteca golang-jwt
\n\nPara trabalhar com JWT em Go, use o pacote github.com/golang-jwt/jwt/v5. Instale-o com o comando:
go get github.com/golang-jwt/jwt/v5\n\nApós a instalação, você pode importar o pacote no seu código:
\n\nimport (\n "github.com/golang-jwt/jwt/v5"\n)\n\nEstrutura do token JWT
\n\nUm 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
Criação de um token JWT em Go
\n\nVamos 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\npackage 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\nVerificação e análise de um token JWT
\n\nPara verificar a autenticidade do token, use a mesma chave secreta. É importante verificar o prazo de validade e a assinatura.
\n\npackage 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\nUsando claims estruturados
\n\nPara maior conveniência, você pode definir sua própria estrutura de claims, implementando a interface jwt.Claims:
type CustomClaims struct {\n UserID int `json:"user_id"`\n Role string `json:"role"`\n jwt.RegisteredCl Também na biblioteca
Biblioteca GraphQL JavaScript (Node.js): Guia Completo sobre Apollo Server e Ferramentas
Cliente OAuth para PHP: integração com Google, GitHub e VK
Trabalho com XML em Go (Golang): pacote encoding/xml e alternativas
Zod para TypeScript: guia completo com exemplos