Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Autenticação e Autorização com Token JWT

Gostaria de informar que os cursos de Golang de vocês são bons, porém está faltando um tópico muito importante nos cursos que abordam Rest API, que seria Autenticação e Autorização com Token JWT usando um Login de Usuário para obter o Token e após o Login, cada Requisição deve conter o Token no Header da Requisição para verificar se o Usuário é Autorizado a Acessar o Recurso.

Um abraço e Muito obrigado,

Rinaldo Antonio Cuziol

1 resposta
solução!

Olá, Rinaldo. Tudo bem?

Muito bom saber que você está gostando dos cursos de Golang! Sobre a sua dúvida, a implementação de autenticação e autorização usando JWT (JSON Web Tokens) é realmente um tópico essencial para o desenvolvimento de APIs seguras.

Para implementar isso em uma API usando Go e Gin, você pode seguir os passos abaixo como um ponto de partida:

  1. Criação do Token JWT: Após o login do usuário, você deve gerar um token JWT. Para isso, você pode usar uma biblioteca como o github.com/dgrijalva/jwt-go. Ao criar o token, inclua informações relevantes no payload, como o ID do usuário e o tempo de expiração.

    import (
        "github.com/dgrijalva/jwt-go"
        "time"
    )
    
    func GenerateJWT(userID string) (string, error) {
        token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
            "user_id": userID,
            "exp":     time.Now().Add(time.Hour * 72).Unix(),
        })
    
        tokenString, err := token.SignedString([]byte("secret"))
        if err != nil {
            return "", err
        }
    
        return tokenString, nil
    }
    
  2. Autenticação do Usuário: No endpoint de login, autentique o usuário com suas credenciais e, em seguida, gere o token JWT usando a função acima.

  3. Autorização com o Token JWT: Para proteger suas rotas, crie um middleware que verifica se o token JWT está presente no header da requisição e se é válido.

    import (
        "github.com/gin-gonic/gin"
        "github.com/dgrijalva/jwt-go"
        "net/http"
    )
    
    func AuthMiddleware() gin.HandlerFunc {
        return func(c *gin.Context) {
            tokenString := c.GetHeader("Authorization")
            if tokenString == "" {
                c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "request does not contain an access token"})
                return
            }
    
            token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
                return []byte("secret"), nil
            })
    
            if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
                c.Set("userID", claims["user_id"])
                c.Next()
            } else {
                c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
            }
        }
    }
    
  4. Protegendo Rotas: Use o middleware nas rotas que precisam de proteção.

    r := gin.Default()
    r.Use(AuthMiddleware())
    
    r.GET("/protected", func(c *gin.Context) {
        userID := c.MustGet("userID").(string)
        c.JSON(http.StatusOK, gin.H{"user_id": userID})
    })
    

Esses são passos básicos para começar com autenticação e autorização usando JWT em uma API REST com Go e Gin. Espero que isso ajude a complementar seus estudos, dar uma visão.

Seu feedback será encaminhado para a equipe de conteúdo. Quiser sugerir um curso específico, temos esse link de sugestão de conteúdos: Sugerir-conteúdo-e-cursos

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!