cleanup: убрать IP, реальные URL, креды из публичных файлов
- 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
This commit is contained in:
+2
-2
@@ -13,8 +13,8 @@ DEV_MODE=true
|
|||||||
DEFAULT_LIMIT=15
|
DEFAULT_LIMIT=15
|
||||||
|
|
||||||
# ── Сессия (сгенерировать: openssl rand -base64 32) ──
|
# ── Сессия (сгенерировать: openssl rand -base64 32) ──
|
||||||
SESSION_SECRET=сменить_на_случайную_строку
|
SESSION_SECRET=<openssl rand -base64 32>
|
||||||
CSRF_SECRET=сменить_на_случайную_строку
|
CSRF_SECRET=<openssl rand -base64 32>
|
||||||
|
|
||||||
# ── Порт сервера ──
|
# ── Порт сервера ──
|
||||||
PORT=3001
|
PORT=3001
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
|
|
||||||
**Stack:** Node.js + Express + EJS + PostgreSQL
|
**Stack:** Node.js + Express + EJS + PostgreSQL
|
||||||
**Auth:** Mock RS256 JWT (dev) / Keycloak OIDC (production)
|
**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
|
## 2. Architecture
|
||||||
|
|
||||||
```
|
```
|
||||||
Browser → nginx:80 → Express:3001
|
Browser → nginx:443 → Express:3001
|
||||||
├── /export (public, no auth)
|
├── /export (public, no auth)
|
||||||
├── /api/v1/* (Bearer JWT, REST API)
|
├── /api/v1/* (Bearer JWT, REST API)
|
||||||
└── /* (UI layer, SSR EJS, session-based)
|
└── /* (UI layer, SSR EJS, session-based)
|
||||||
|
|||||||
@@ -25,5 +25,5 @@
|
|||||||
- `docs/ТЗ.md` — техническое задание
|
- `docs/ТЗ.md` — техническое задание
|
||||||
- `docs/ТЗ-плюс.md` — уточнения от заказчика
|
- `docs/ТЗ-плюс.md` — уточнения от заказчика
|
||||||
- `docs/keycloak-auth-reference.md` — справка по Keycloak/OIDC
|
- `docs/keycloak-auth-reference.md` — справка по Keycloak/OIDC
|
||||||
- `Files/token.txt` — креды (токены + БД)
|
- `.env.example` — шаблон конфигурации
|
||||||
- `.github/AGENT-GUIDE.md` — полный гайд для AI-агентов (англ.)
|
- `.github/AGENT-GUIDE.md` — полный гайд для AI-агентов (англ.)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ Browser → nginx:443 → Express:3001
|
|||||||
|
|
||||||
Пользователь может принадлежать нескольким компаниям. В JWT claim `ClientID` передаются значения через запятую:
|
Пользователь может принадлежать нескольким компаниям. В JWT claim `ClientID` передаются значения через запятую:
|
||||||
```
|
```
|
||||||
ClientID: "WZ11125,WZ03816"
|
ClientID: "WZ88888,WZ77777"
|
||||||
```
|
```
|
||||||
Первое значение — активная компания. Переключение компаний — через UI.
|
Первое значение — активная компания. Переключение компаний — через UI.
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ cd ipwhitelist-app
|
|||||||
cp .env.example .env # заполнить DB_* и SESSION_SECRET
|
cp .env.example .env # заполнить DB_* и SESSION_SECRET
|
||||||
npm install
|
npm install
|
||||||
psql -U postgres -d ipwhitelist -f sql/schema.sql
|
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
|
## Production deploy
|
||||||
|
|||||||
@@ -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
|
# KC_BASE_URL=https://lk-api-gateway-test.ngcloud.ru/api/v1/iam/auth
|
||||||
|
|
||||||
# ── OAuth client (зарегистрированное приложение) ──
|
# ── OAuth client (зарегистрированное приложение) ──
|
||||||
KC_CLIENT_ID=deck-test.ngcloud.ru
|
KC_CLIENT_ID=<ID клиента из Keycloak>
|
||||||
KC_CLIENT_SECRET=...
|
KC_CLIENT_SECRET=<секрет клиента>
|
||||||
|
|
||||||
# ── Публичный URL приложения (для редиректа из Keycloak) ──
|
# ── Публичный URL приложения (для редиректа из Keycloak) ──
|
||||||
APP_URL=https://white.nodejsk8s.dev.nubes.ru
|
APP_URL=https://<ваш-домен>
|
||||||
|
|
||||||
# ── JWKS URL для верификации токенов (если не через KC_BASE_URL) ──
|
# ── JWKS URL для верификации токенов (если не через KC_BASE_URL) ──
|
||||||
# JWKS_URL=https://keycloak.nubes.ru/realms/cloud/protocol/openid-connect/certs
|
# 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`. |
|
| **ClientID в токене** | Какой claim содержит ID компании? Сейчас ждём `ClientID` или `client_id`. |
|
||||||
| **Admin-роль** | Как определяется admin? `clientId === WZ01112` достаточно или нужен отдельный claim? |
|
| **Admin-роль** | Как определяется admin? `clientId === WZ01112` достаточно или нужен отдельный claim? |
|
||||||
| **Redirect URI** | Какой зарегистрирован? `https://white.nodejsk8s.dev.nubes.ru/callback`? |
|
| **Redirect URI** | Какой зарегистрирован? `https://<домен>/callback`? |
|
||||||
| **Несколько компаний** | `clientid` в токене приходит как одна строка или через запятую? |
|
| **Несколько компаний** | `clientid` в токене приходит как одна строка или через запятую? |
|
||||||
|
|
||||||
### 3. Что сделано в коде (готово)
|
### 3. Что сделано в коде (готово)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
## 1. PostgreSQL — установка
|
## 1. PostgreSQL — установка
|
||||||
|
|
||||||
**Где:** на этой же ВМ, рядом с приложением.
|
**Где:** на этой же ВМ, рядом с приложением.
|
||||||
**Версия:** 16 (или любая 15+).
|
**Версия:** 16 (на Ubuntu 22.04 — 14, на 24.04 — 16).
|
||||||
**Безопасность:** слушает только localhost (наружу не торчит).
|
**Безопасность:** слушает только localhost (наружу не торчит).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -20,11 +20,7 @@ Realm: **`cloud`** на `keycloak.nubes.ru`
|
|||||||
|
|
||||||
## 2. Зарегистрированное приложение (OAuth client)
|
## 2. Зарегистрированное приложение (OAuth client)
|
||||||
|
|
||||||
| Параметр | Значение |
|
`client_id` — выдаётся DevOps при регистрации приложения в Keycloak.
|
||||||
|---|---|
|
|
||||||
| `client_id` | `deck-test.ngcloud.ru` |
|
|
||||||
|
|
||||||
Источник: HAR-файл `Files/nubes_login.har` (в query-параметрах auth request).
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -45,39 +41,30 @@ Realm: **`cloud`** на `keycloak.nubes.ru`
|
|||||||
|
|
||||||
## 4. Получение токена через API Gateway (альтернативный путь)
|
## 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 <url API Gateway>/token
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
Body: {"code": "<authorization_code>"}
|
Body: {"code": "<authorization_code>"}
|
||||||
```
|
```
|
||||||
|
|
||||||
Ответ:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"access_token": "...",
|
|
||||||
"refresh_token": "...",
|
|
||||||
"expires_in": 43200
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. JWT-токены
|
## 5. JWT-токены
|
||||||
|
|
||||||
### 5.1. Токен из `Files/token.txt` (test-окружение)
|
### 5.1. Пример структуры JWT (deprecated)
|
||||||
|
|
||||||
| Поле | Значение |
|
```
|
||||||
|---|---|
|
iss: https://<issuer>/...
|
||||||
| `iss` | `https://auth.k8s.ngcloud.ru` |
|
aud: <audience>
|
||||||
| `aud` | `backend` |
|
sub: <email>
|
||||||
| `sub` | `tazetdinovn@gmail.com` |
|
name: <ФИО пользователя>
|
||||||
| `name` | Наиль Тазетдинов |
|
email: <email пользователя>
|
||||||
| `email` | `tazetdinovn@gmail.com` |
|
exp: <timestamp>
|
||||||
| `expires_in` | 86400 (24ч) |
|
scope: openid
|
||||||
| `scope` | `openid` |
|
token_type: Bearer
|
||||||
| `token_type` | `Bearer` |
|
```
|
||||||
|
|
||||||
Claims (массив):
|
Claims (массив):
|
||||||
- `""`
|
- `""`
|
||||||
|
|||||||
Reference in New Issue
Block a user