package auth import ( "fmt" "os" "strings" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/storage" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" ) var jwtSecret = []byte(os.Getenv("JWT_SECRET")) func GenerateJWT(user storage.User) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{ "id": user.ID, "email": user.Email, "github_id": user.GithubID, }) tokenString, err := token.SignedString(jwtSecret) if err != nil { return "", err } return tokenString, nil } func JWTMiddleware() gin.HandlerFunc { return func(c *gin.Context) { auth := c.GetHeader("Authorization") if !strings.HasPrefix(auth, "Bearer ") { c.AbortWithStatusJSON(401, gin.H{"error": "Bearer required"}) return } tokenString := strings.TrimPrefix(auth, "Bearer ") token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return jwtSecret, nil }) if err != nil || !token.Valid { c.AbortWithStatusJSON(401, gin.H{"error": "invalid token"}) return } claims, ok := token.Claims.(jwt.MapClaims) if !ok { c.AbortWithStatusJSON(401, gin.H{"error": "invalid claims"}) return } c.Set("user_id", int(claims["id"].(float64))) c.Set("login", claims["login"].(string)) c.Next() } }