/
Arsinenko
/
CompClubAPI_Go
Обзор
Документация
Войти
/
Arsinenko
/
CompClubAPI_Go
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
internal/middleware/auth_middleware.go
115 строк
3 KB
Arsinenko
Club handler
06 окт 2025, 16:53
06 окт 2025, 16:53
e0961e8
Код
Авторство
О чём код?
// middleware/auth_middleware.go package middleware import ( "fmt" "net/http" "strings" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt" ) const ( Admin = "admin" Client = "client" ) // AuthMiddleware проверяет JWT токен и добавляет информацию о пользователе в контекст func AuthMiddleware(jwtMiddleware JwtMiddleware) gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is required"}) c.Abort() return } // Формат: Bearer <token> parts := strings.Fields(authHeader) if len(parts) != 2 || !strings.EqualFold(parts[0], "Bearer") { c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header format must be Bearer {token}"}) c.Abort() return } token, err := jwtMiddleware.VerifyToken(parts[1]) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token: " + err.Error()}) c.Abort() return } claims, err := jwtMiddleware.GetClaims(token) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token claims: " + err.Error()}) c.Abort() return } // Добавляем login в контекст для использования в следующих middleware/handlers if login, ok := claims["login"].(string); ok { c.Set("userLogin", login) } c.Next() } } // AdminMiddleware проверяет, что пользователь имеет роль admin func AdminMiddleware(jwtMiddleware JwtMiddleware) gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is required"}) c.Abort() return } parts := strings.Fields(authHeader) if len(parts) != 2 || !strings.EqualFold(parts[0], "Bearer") { c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header format must be Bearer {token}"}) c.Abort() return } tokenStr := parts[1] // Парсим токен для получения роли token, err := jwt.Parse(tokenStr, 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 []byte(jwtMiddleware.GetSecretKey()), nil }) if err != nil || !token.Valid { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"}) c.Abort() return } claims, ok := token.Claims.(jwt.MapClaims) if !ok { c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token claims"}) c.Abort() return } // Проверяем роль role, ok := claims["role"].(string) if !ok || role != Admin { c.JSON(http.StatusForbidden, gin.H{"error": "Admin access required"}) c.Abort() return } // Добавляем информацию в контекст if login, ok := claims["login"].(string); ok { c.Set("userLogin", login) } c.Set("userRole", role) c.Next() } }