From 2194c1650f127d630ebece68d36136a7ec70cb77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Wed, 3 Jun 2026 13:10:48 +0300 Subject: [PATCH] =?UTF-8?q?cleanup:=20=D1=83=D0=B1=D1=80=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20IP,=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20URL?= =?UTF-8?q?,=20=D0=BA=D1=80=D0=B5=D0=B4=D1=8B=20=D0=B8=D0=B7=20=D0=BF?= =?UTF-8?q?=D1=83=D0=B1=D0=BB=D0=B8=D1=87=D0=BD=D1=8B=D1=85=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AGENT-GUIDE.md: убран IP ВМ, HTTP→HTTPS - copilot-instructions.md: Files/token.txt→.env.example - keycloak-auth-reference.md: убраны реальные client_id, URL gateway, email - deploy-keycloak.md: реальные параметры заменены на шаблоны - .env.example: русские значения→шаблоны - README.md: порт 3000, multi-company пример под mock --- .env.example | 4 ++-- .github/AGENT-GUIDE.md | 4 ++-- .github/copilot-instructions.md | 2 +- README.md | 4 ++-- docs/deploy-keycloak.md | 10 ++++---- docs/devops-deploy.md | 2 +- docs/keycloak-auth-reference.md | 41 +++++++++++---------------------- 7 files changed, 27 insertions(+), 40 deletions(-) diff --git a/.env.example b/.env.example index 8c99258..a870698 100644 --- a/.env.example +++ b/.env.example @@ -13,8 +13,8 @@ DEV_MODE=true DEFAULT_LIMIT=15 # ── Сессия (сгенерировать: openssl rand -base64 32) ── -SESSION_SECRET=сменить_на_случайную_строку -CSRF_SECRET=сменить_на_случайную_строку +SESSION_SECRET= +CSRF_SECRET= # ── Порт сервера ── PORT=3001 diff --git a/.github/AGENT-GUIDE.md b/.github/AGENT-GUIDE.md index 890d764..aff21d8 100644 --- a/.github/AGENT-GUIDE.md +++ b/.github/AGENT-GUIDE.md @@ -9,12 +9,12 @@ **Stack:** Node.js + Express + EJS + PostgreSQL **Auth:** Mock RS256 JWT (dev) / Keycloak OIDC (production) -**Deployment:** PM2 on VM (`5.172.178.213`), HTTP only via `italo.kube5s.ru` +**Deployment:** PM2, behind nginx on a VM ## 2. Architecture ``` -Browser → nginx:80 → Express:3001 +Browser → nginx:443 → Express:3001 ├── /export (public, no auth) ├── /api/v1/* (Bearer JWT, REST API) └── /* (UI layer, SSR EJS, session-based) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 0590484..cb1b5e4 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -25,5 +25,5 @@ - `docs/ТЗ.md` — техническое задание - `docs/ТЗ-плюс.md` — уточнения от заказчика - `docs/keycloak-auth-reference.md` — справка по Keycloak/OIDC -- `Files/token.txt` — креды (токены + БД) +- `.env.example` — шаблон конфигурации - `.github/AGENT-GUIDE.md` — полный гайд для AI-агентов (англ.) diff --git a/README.md b/README.md index cb0e79e..4b2b29f 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Browser → nginx:443 → Express:3001 Пользователь может принадлежать нескольким компаниям. В JWT claim `ClientID` передаются значения через запятую: ``` -ClientID: "WZ11125,WZ03816" +ClientID: "WZ88888,WZ77777" ``` Первое значение — активная компания. Переключение компаний — через UI. @@ -73,7 +73,7 @@ cd ipwhitelist-app cp .env.example .env # заполнить DB_* и SESSION_SECRET npm install psql -U postgres -d ipwhitelist -f sql/schema.sql -npm start # http://localhost:3001 + DEV_MODE=true +npm start # http://localhost:3000 + DEV_MODE=true ``` ## Production deploy diff --git a/docs/deploy-keycloak.md b/docs/deploy-keycloak.md index f13cd33..b3f3d82 100644 --- a/docs/deploy-keycloak.md +++ b/docs/deploy-keycloak.md @@ -19,11 +19,11 @@ KC_BASE_URL=https://keycloak.nubes.ru/realms/cloud # KC_BASE_URL=https://lk-api-gateway-test.ngcloud.ru/api/v1/iam/auth # ── OAuth client (зарегистрированное приложение) ── -KC_CLIENT_ID=deck-test.ngcloud.ru -KC_CLIENT_SECRET=... +KC_CLIENT_ID= +KC_CLIENT_SECRET=<секрет клиента> # ── Публичный URL приложения (для редиректа из Keycloak) ── -APP_URL=https://white.nodejsk8s.dev.nubes.ru +APP_URL=https://<ваш-домен> # ── JWKS URL для верификации токенов (если не через KC_BASE_URL) ── # JWKS_URL=https://keycloak.nubes.ru/realms/cloud/protocol/openid-connect/certs @@ -33,10 +33,10 @@ APP_URL=https://white.nodejsk8s.dev.nubes.ru | Вопрос | Описание | |---|---| -| **API Gateway?** | Токен получать напрямую из Keycloak или через `lk-api-gateway-test.ngcloud.ru`? | +| **API Gateway?** | Токен получать напрямую из Keycloak или через API Gateway? | | **ClientID в токене** | Какой claim содержит ID компании? Сейчас ждём `ClientID` или `client_id`. | | **Admin-роль** | Как определяется admin? `clientId === WZ01112` достаточно или нужен отдельный claim? | -| **Redirect URI** | Какой зарегистрирован? `https://white.nodejsk8s.dev.nubes.ru/callback`? | +| **Redirect URI** | Какой зарегистрирован? `https://<домен>/callback`? | | **Несколько компаний** | `clientid` в токене приходит как одна строка или через запятую? | ### 3. Что сделано в коде (готово) diff --git a/docs/devops-deploy.md b/docs/devops-deploy.md index c6ace94..3e34c65 100644 --- a/docs/devops-deploy.md +++ b/docs/devops-deploy.md @@ -22,7 +22,7 @@ ## 1. PostgreSQL — установка **Где:** на этой же ВМ, рядом с приложением. -**Версия:** 16 (или любая 15+). +**Версия:** 16 (на Ubuntu 22.04 — 14, на 24.04 — 16). **Безопасность:** слушает только localhost (наружу не торчит). ```bash diff --git a/docs/keycloak-auth-reference.md b/docs/keycloak-auth-reference.md index 02bf3d4..a34e1f7 100644 --- a/docs/keycloak-auth-reference.md +++ b/docs/keycloak-auth-reference.md @@ -20,11 +20,7 @@ Realm: **`cloud`** на `keycloak.nubes.ru` ## 2. Зарегистрированное приложение (OAuth client) -| Параметр | Значение | -|---|---| -| `client_id` | `deck-test.ngcloud.ru` | - -Источник: HAR-файл `Files/nubes_login.har` (в query-параметрах auth request). +`client_id` — выдаётся DevOps при регистрации приложения в Keycloak. --- @@ -45,39 +41,30 @@ Realm: **`cloud`** на `keycloak.nubes.ru` ## 4. Получение токена через API Gateway (альтернативный путь) -Из HAR: код обменивается не напрямую в Keycloak, а через **API Gateway ngcloud**: +Если в инфраструктуре есть API Gateway, код обменивается не напрямую в Keycloak, а через него: ``` -POST https://lk-api-gateway-test.ngcloud.ru/api/v1/iam/auth/token +POST /token Content-Type: application/json Body: {"code": ""} ``` -Ответ: -```json -{ - "access_token": "...", - "refresh_token": "...", - "expires_in": 43200 -} -``` - --- ## 5. JWT-токены -### 5.1. Токен из `Files/token.txt` (test-окружение) +### 5.1. Пример структуры JWT (deprecated) -| Поле | Значение | -|---|---| -| `iss` | `https://auth.k8s.ngcloud.ru` | -| `aud` | `backend` | -| `sub` | `tazetdinovn@gmail.com` | -| `name` | Наиль Тазетдинов | -| `email` | `tazetdinovn@gmail.com` | -| `expires_in` | 86400 (24ч) | -| `scope` | `openid` | -| `token_type` | `Bearer` | +``` +iss: https:///... +aud: +sub: +name: <ФИО пользователя> +email: +exp: +scope: openid +token_type: Bearer +``` Claims (массив): - `""`