auth-jwt

JWT аутентификация: токены, роли, авто-refresh, middleware

Code
Source: magicreek + IFCG
Files: 4
Stack:
Next.jsReactAxios

Specification

auth-jwt

Назначение

JWT-аутентификация с поддержкой access/refresh токенов, ролевого доступа и авто-обновления.

Контракты

API Endpoints

МетодURLТелоОтвет

|-------|-----|------|-------|

POST/auth/login`{ email, password }``{ access, refresh, user }`
POST/auth/refresh`{ refresh }``{ access, refresh? }`
GET/auth/me— (Bearer token)`{ id, email, name, role }`

Серверная сторона (бэкенд)

// Хеширование пароля
hashPassword(password: string): Promise<string>
verifyPassword(password: string, hash: string): Promise<boolean>

// Токены
createToken(userId: string): string        // JWT, expiresIn: "7d"
verifyToken(token: string): { userId: string } | null

// Middleware
getAuthUser(request: Request): Promise<User | null>  // Из Bearer header
verifyInternalApiKey(request: Request): boolean        // Из x-api-key header

// Авторизация
verifyProjectMembership(userId: string, projectId: string): Promise<boolean>

Клиентская сторона (фронтенд)

// Token storage (localStorage)
auth.getAccess(): string | null
auth.getRefresh(): string | null
auth.setTokens(access: string, refresh: string): void
auth.clear(): void
auth.isLoggedIn(): boolean

// Axios interceptors
// Request: добавляет Authorization: Bearer <access>
// Response 401: пробует refresh → retry, при неудаче → redirect /login

Модель данных

model User {
  id        String   @id @default(uuid())
  email     String   @unique
  password  String
  name      String
  role      UserRole @default(viewer)
}

enum UserRole {
  admin
  developer
  viewer
}

Конфигурация

ПеременнаяОписаниеОбязательно

|-----------|----------|-------------|

JWT_SECRETСекрет для подписи JWTДа (prod)

Зависимости

Серверная: bcryptjs, jsonwebtoken, ORM (Prisma)
Клиентская: axios
БД: PostgreSQL (или любая, поддерживаемая ORM)

Реализации

СтекПутьИсточникСтатус

|------|------|----------|--------|

Next.js (серверная)implementations/nextjs/magicreekпроверен

Адаптация

**JWT_SECRET** — задать свой секрет в env.
**Token expiry** — изменить "7d" в createToken() при необходимости.
**Роли** — расширить enum UserRole под свой проект.
**localStorage keys** — заменить "ifcg_access"/"ifcg_refresh" на свои (клиентская сторона).
**Login redirect** — изменить `/login` path при необходимости.
**Модель User** — расширить поля (аватар, телефон и т.д.).