From ec2f094f4847ea35e228cc266bcce8fce4f624da Mon Sep 17 00:00:00 2001 From: EugeneTes Date: Fri, 16 Oct 2026 07:40:40 +0000 Subject: [PATCH] =?UTF-8?q?CRM=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B5=D1=85?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D0=BD=D0=B0=20shotam.tvorymo.com:=20allow?= =?UTF-8?q?list=20origin=20(CRM=5FORIGINS)=20=D0=B4=D0=BB=D1=8F=20postMess?= =?UTF-8?q?age=20=D0=B8=20frame-ancestors,=20=D1=81=D1=82=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=20CRM=20=D0=BE=D1=82=20=D0=BA=D0=BE=D1=80=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 2 +- README.md | 9 +++++++-- SPEC.md | 6 +++--- public/index.html | 10 +++++++--- server.js | 8 ++++++-- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2d044fb..6c252d5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ - Деплой: Coolify на сервере storage — env `COOLIFY_URL`, `COOLIFY_KEY` (через профиль «Storage coolify»). Деплоить через Coolify v4 REST API (скилл `deploying-to-coolify-via-api`), fire-and-forget. - Домен страницы: `https://test-crm.tes.gd` (HTTPS обязателен; DNS и домен на том же сервере). -- CRM: `https://test.units.tvorymo.com`. Supabase: `https://yjxbkcqsquwbsyoonfkn.supabase.co`. +- CRM: `https://shotam.tvorymo.com`, `https://units.tvorymo.com` (env `CRM_ORIGINS`). CSS/JS CRM — от корня: `/css/crm.css`, `/css/tvorymo-ui.css`, `/js/pagebridge.js`. Supabase: `https://yjxbkcqsquwbsyoonfkn.supabase.co`. - Publishable-ключ Supabase пришлёт Лана (секретарь владельца) напрямую — запиши его сюда, в раздел ниже (ключ публичный по дизайну). ## Supabase publishable key diff --git a/README.md b/README.md index 434cf35..da954da 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,13 @@ Supabase `GET /auth/v1/user` (+ `exp`, `aud = authenticated`) и показывает имя/email/id. - Node 22, без зависимостей: `server.js` + `public/index.html`. -- Заголовок `Content-Security-Policy: frame-ancestors *`, без `X-Frame-Options`. -- Env: `SUPABASE_URL`, `SUPABASE_PUBLISHABLE_KEY`, `PORT` (по умолчанию 3000). +- Разрешённые origin CRM — env `CRM_ORIGINS` (через запятую; по умолчанию + `https://shotam.tvorymo.com,https://units.tvorymo.com`). Используются в + `Content-Security-Policy: frame-ancestors …` (без `X-Frame-Options`) и как allowlist для `postMessage`: + сообщения от других origin игнорируются (пишется в журнал). +- Стили CRM берутся с `https://shotam.tvorymo.com/css/tvorymo-ui.css` и `/css/crm.css` (от корня; + старые пути `/tvorymo-crm/css/...` дают 404). +- Env: `SUPABASE_URL`, `SUPABASE_PUBLISHABLE_KEY`, `CRM_ORIGINS`, `PORT` (по умолчанию 3000). - Деплой: Coolify (Dockerfile), домен `https://test-crm.tes.gd`. Подробности — `SPEC.md`. diff --git a/SPEC.md b/SPEC.md index 47c5071..7870c01 100644 --- a/SPEC.md +++ b/SPEC.md @@ -12,13 +12,13 @@ ## Адреса - Страница: `https://test-crm.tes.gd` (HTTPS обязателен). -- CRM: `https://test.units.tvorymo.com`. +- CRM: `https://shotam.tvorymo.com` и `https://units.tvorymo.com` (с 2026-10-16; `test.units.tvorymo.com` больше не используется — 403). Та же база Supabase. - Supabase: `https://yjxbkcqsquwbsyoonfkn.supabase.co`. ## Протокол (со стороны страницы) 1. После загрузки: `window.parent.postMessage({ type: "crm:ready", version: 1 }, "*")`. -2. Принимать `crm:auth` `{ access_token, expires_at, user: { id, email, name } }` от любого origin (решение владельца для теста). Origin отправителя показывать на странице. +2. Принимать `crm:auth` `{ access_token, expires_at, user: { id, email, name } }` только от разрешённых origin CRM (env `CRM_ORIGINS`, решение владельца 2026-10-16). Origin отправителя показывать на странице. 3. `access_token` отправить на сервер страницы; сервер проверяет его через `GET /auth/v1/user` (заголовки `apikey: `, `Authorization: Bearer `) и сверяет `exp`, `aud = "authenticated"`. 4. Имя и email брать из ответа Supabase, не из `user` в сообщении (имя из `user_metadata`; если пусто, показать «имя не задано в Supabase» и email). 5. Кнопка «Обновить токен»: отправляет `{ type: "crm:refresh" }`, CRM отвечает новым `crm:auth`; страница показывает, что токен сменился (время `expires_at`, без самого токена). @@ -26,7 +26,7 @@ ## Требования -- Заголовок `Content-Security-Policy: frame-ancestors *` (встраивание откуда угодно, для теста), без `X-Frame-Options`. +- Заголовок `Content-Security-Policy: frame-ancestors ` (только разрешённые origin CRM), без `X-Frame-Options`. - Токен не логировать ни в браузере, ни на сервере. Сессию держать в памяти. - Publishable-ключ Supabase агент получает от Ланы и записывает в свой CLAUDE.md (ключ публичный по дизайну). - Без открытого токена в ответе страницы: показываем только имя, email, id, origin, `expires_at`. diff --git a/public/index.html b/public/index.html index 2283b06..b464600 100644 --- a/public/index.html +++ b/public/index.html @@ -7,8 +7,8 @@ - - + +
@@ -151,6 +151,7 @@