Какие подходы и технологии используются для реализации аутентификации и авторизации в Go-приложениях?

Ответ

Важно различать два понятия:

  1. Аутентификация (Authentication) — проверка того, кем является пользователь (например, по логину и паролю).
  2. Авторизация (Authorization) — проверка того, какие действия разрешены аутентифицированному пользователю.

1. Аутентификация

Для stateless-сервисов (API, микросервисы) самым популярным подходом является JWT (JSON Web Tokens).

  • Принцип: После успешного входа пользователя сервер генерирует токен, содержащий информацию о пользователе (ID, роли), и подписывает его секретным ключом. Клиент отправляет этот токен в заголовке Authorization при каждом запросе.
  • Преимущества: Не требует хранения сессий на сервере, легко масштабируется.

Пример middleware для проверки JWT:

func JWTMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        authHeader := r.Header.Get("Authorization")
        tokenString := strings.TrimPrefix(authHeader, "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 []byte("your-secret-key"), nil
        })

        if err != nil || !token.Valid {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        // Можно передать claims пользователя дальше через контекст
        // ctx := context.WithValue(r.Context(), "userClaims", claims)
        // next.ServeHTTP(w, r.WithContext(ctx))
        next.ServeHTTP(w, r)
    })
}

2. Авторизация

После того как пользователь аутентифицирован, нужно проверить его права. Распространенные паттерны:

  • RBAC (Role-Based Access Control): Самый частый подход. Пользователям назначаются роли (например, admin, user, editor), а разрешения привязываются к ролям. Например, только роль admin может удалять пользователей.
  • ABAC (Attribute-Based Access Control): Более гибкий подход. Доступ определяется на основе атрибутов пользователя, запрашиваемого ресурса и окружения (например, разрешить доступ, только если пользователь из того же отдела и в рабочее время).

Для реализации сложных политик авторизации часто используют библиотеки, например, Casbin, которая позволяет определять правила доступа в конфигурационном файле и проверять их в коде.