📊 Capítulo 10: Autenticação Stateless & JWT
Especialização Backend com Go & Gin Gonic
🗺️ O Fluxo de Autenticação com Tokens JWT no Gin
sequenceDiagram
autonumber
actor C as Cliente / Frontend
participant H as AuthHandler (POST /login)
participant S as AuthService (BCrypt & JWT)
participant MW as JWTMiddleware
participant EP as Endpoint Protegido
C->>H: POST /api/v1/auth/login (email, senha)
H->>S: Autenticar(email, senha)
S->>S: bcrypt.CompareHashAndPassword()
S->>S: jwt.NewWithClaims().SignedString(secret)
S-->>H: Retorna Access Token JWT
H-->>C: HTTP 200 {"token": "eyJh..."}
Note over C,EP: Requisições Protegidas Subsequentes
C->>MW: GET /api/v1/perfil Header "Authorization: Bearer <token>"
MW->>MW: Valida assinatura e expiração do Token
MW->>MW: c.Set("usuario_id", claims.UserID)
MW->>EP: c.Next()
EP-->>C: HTTP 200 Dados do Perfil
🎯 Slide 1: Criptografia de Senhas com golang.org/x/crypto/bcrypt
func GerarHashSenha(senha string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(senha), 12)
return string(bytes), err
}
func VerificarSenha(senhaPura, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(senhaPura))
return err == nil
}
🎯 Slide 2: Claims Customizados com golang-jwt/jwt/v5
type CustomClaims struct {
UserID uint `json:"user_id"`
Email string `json:"email"`
Role string `json:"role"`
jwt.RegisteredClaims
}
🎯 Slide 3: Middleware de Autenticação JWT
func AuthMiddleware(secret string) gin.HandlerFunc {
return func(c *gin.Context) {
tokenString := extrairBearerToken(c)
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(t *jwt.Token) (interface{}, error) {
return []byte(secret), nil
})
if err != nil || !token.Valid {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"erro": "Token inválido ou expirado"})
return
}
claims := token.Claims.(*CustomClaims)
c.Set("usuario_id", claims.UserID)
c.Next()
}
}
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim