ui: archive upload mode + lint stub, fix stress warmup output, add descriptions
This commit is contained in:
@@ -1,5 +1,167 @@
|
||||
# Логика авторизации — Fission Console
|
||||
|
||||
> ⚠️ ЛЕГАСИ (актуально до ~апреля 2026): описание ниже относится к старой схеме с Deck API + JWT.
|
||||
> Актуальное описание — **выше этого блока**, в разделе "АКТУАЛЬНО (май 2026+)".
|
||||
|
||||
---
|
||||
|
||||
# АКТУАЛЬНО (май 2026+)
|
||||
|
||||
## Что принимает сервер
|
||||
|
||||
Токен передаётся одним из двух способов:
|
||||
- Заголовок `X-Auth-Token: <токен>`
|
||||
- Заголовок `Authorization: Bearer <токен>`
|
||||
|
||||
`X-Auth-Env` — необязателен, по умолчанию `test`.
|
||||
|
||||
---
|
||||
|
||||
## Типы токенов и маршрутизация (MultiAuthenticator)
|
||||
|
||||
Сервер использует `MultiAuthenticator`, который определяет тип по форме токена:
|
||||
|
||||
| Форма токена | Authenticator | Описание |
|
||||
|---|---|---|
|
||||
| JWT (три части через `.`) | `DeckAuthenticator` или `TestAuthenticator` | Реальный облачный токен или тест-JWT |
|
||||
| Любая строка ≥6 символов | `DemoAuthenticator` | Demo-логин без внешних запросов |
|
||||
| Строка <6 символов | — | Ошибка 401 |
|
||||
|
||||
---
|
||||
|
||||
## DemoAuthenticator (текущий основной режим)
|
||||
|
||||
Принимает **любую строку ≥6 символов** как логин. Не ходит во внешние сервисы.
|
||||
|
||||
```
|
||||
login (≥6 символов)
|
||||
│
|
||||
▼
|
||||
Sub = UUID v5(login) ← детерминированный, фиксированный UUID namespace
|
||||
Email = "demo-lo***in" ← маскированный для отображения в UI
|
||||
│
|
||||
▼
|
||||
Namespace = "fission-" + hex(SHA256(Sub)[:8])
|
||||
```
|
||||
|
||||
Пример:
|
||||
- login = `livetest@test.local`
|
||||
- Sub = `uuidV5("livetest@test.local")` = фиксированный UUID
|
||||
- Namespace = `fission-c3fce59430e41b0f`
|
||||
|
||||
Каждый логин → один и тот же namespace (детерминированно).
|
||||
|
||||
---
|
||||
|
||||
## DeckAuthenticator (production JWT)
|
||||
|
||||
Для JWT-токенов из облака NUBES:
|
||||
|
||||
```
|
||||
JWT токен
|
||||
│
|
||||
├─► validateToken → GET {deckAPI}/index.cfm/instances
|
||||
│ Authorization: Bearer <token>
|
||||
│ 401 → ошибка | другой → ОК
|
||||
│ Кэш на 5 минут (sync.Map, ключ "env:token")
|
||||
│
|
||||
└─► identityFromJWT → decode payload (base64url, без верификации подписи)
|
||||
→ claim "sub" → Sub
|
||||
→ claim "email" → Email (опционально)
|
||||
```
|
||||
|
||||
Deck API URL по стендам:
|
||||
- `prod` → `https://deck-api.ngcloud.ru/api/v1`
|
||||
- `dev` → `https://deck-api-dev.ngcloud.ru/api/v1`
|
||||
- `test` → `https://deck-api-test.ngcloud.ru/api/v1`
|
||||
|
||||
---
|
||||
|
||||
## TestAuthenticator (тест-режим, устаревший)
|
||||
|
||||
Принимает JWT — декодирует sub из payload. Или строку с `@` — использует как sub напрямую.
|
||||
Не ходит в Deck API. Включался через `FISSION_TEST_MODE=true`.
|
||||
|
||||
> ⚠️ Сейчас не используется — заменён на DemoAuthenticator.
|
||||
|
||||
---
|
||||
|
||||
## Вычисление namespace: `NamespaceForSub`
|
||||
|
||||
```go
|
||||
func NamespaceForSub(sub string) string {
|
||||
h := sha256.Sum256([]byte(sub))
|
||||
return "fission-" + hex.EncodeToString(h[:8]) // 16 hex символов
|
||||
}
|
||||
```
|
||||
|
||||
Namespace **детерминирован**: одинаковый логин → всегда один namespace.
|
||||
|
||||
---
|
||||
|
||||
## authMiddleware — что происходит на каждый запрос
|
||||
|
||||
```
|
||||
Входящий HTTP запрос
|
||||
│
|
||||
├─► authTokenFromRequest → X-Auth-Token || Authorization: Bearer
|
||||
│
|
||||
├─► authenticator.Authenticate(token, env) → UserIdentity{Sub, Email}
|
||||
│ ошибка → 401
|
||||
│
|
||||
├─► NamespaceForSub(Sub) → "fission-XXXXXXXXXXXXXXXX"
|
||||
│
|
||||
├─► nsManager.EnsureUserNS(namespace)
|
||||
│ → создаёт K8s namespace + RBAC если нет
|
||||
│ ошибка → 502
|
||||
│
|
||||
└─► контекст запроса: ctxKeyNS=namespace, ctxKeyIdentity=identity
|
||||
→ handler работает в namespace пользователя
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## POST /auth — явный вход
|
||||
|
||||
```
|
||||
POST /console/api/auth
|
||||
Body: { "token": "...", "env": "test" }
|
||||
│
|
||||
└─► то же что authMiddleware, возвращает:
|
||||
{ ok: true, namespace: "fission-...", email: "demo-lo***in" }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Итого — полная схема (актуальная)
|
||||
|
||||
```
|
||||
Пользователь передаёт токен/логин
|
||||
│
|
||||
▼
|
||||
MultiAuthenticator
|
||||
├── JWT? → DeckAuthenticator (Deck API + JWT decode)
|
||||
└── нет → DemoAuthenticator (≥6 символов → UUID v5)
|
||||
│
|
||||
▼
|
||||
UserIdentity { Sub, Email }
|
||||
│
|
||||
▼
|
||||
NamespaceForSub(Sub) = "fission-" + hex(SHA256(Sub)[:8])
|
||||
│
|
||||
▼
|
||||
EnsureUserNS → K8s namespace существует
|
||||
│
|
||||
▼
|
||||
Все хендлеры работают с namespace из context
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# ЛЕГАСИ (до апреля 2026) — не удалять, для анализа
|
||||
|
||||
|
||||
|
||||
## Что вводит пользователь
|
||||
|
||||
В форме логина (`index.html`, overlay `#login-overlay`):
|
||||
|
||||
Reference in New Issue
Block a user