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
|
||||
|
||||
# ── Сессия (сгенерировать: openssl rand -base64 32) ──
|
||||
SESSION_SECRET=сменить_на_случайную_строку
|
||||
CSRF_SECRET=сменить_на_случайную_строку
|
||||
SESSION_SECRET=<openssl rand -base64 32>
|
||||
CSRF_SECRET=<openssl rand -base64 32>
|
||||
|
||||
# ── Порт сервера ──
|
||||
PORT=3001
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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-агентов (англ.)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=<ID клиента из Keycloak>
|
||||
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. Что сделано в коде (готово)
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
## 1. PostgreSQL — установка
|
||||
|
||||
**Где:** на этой же ВМ, рядом с приложением.
|
||||
**Версия:** 16 (или любая 15+).
|
||||
**Версия:** 16 (на Ubuntu 22.04 — 14, на 24.04 — 16).
|
||||
**Безопасность:** слушает только localhost (наружу не торчит).
|
||||
|
||||
```bash
|
||||
|
||||
@@ -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 <url API Gateway>/token
|
||||
Content-Type: application/json
|
||||
Body: {"code": "<authorization_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://<issuer>/...
|
||||
aud: <audience>
|
||||
sub: <email>
|
||||
name: <ФИО пользователя>
|
||||
email: <email пользователя>
|
||||
exp: <timestamp>
|
||||
scope: openid
|
||||
token_type: Bearer
|
||||
```
|
||||
|
||||
Claims (массив):
|
||||
- `""`
|
||||
|
||||
Reference in New Issue
Block a user