CRM переехала на shotam.tvorymo.com: allowlist origin (CRM_ORIGINS) для postMessage и frame-ancestors, стили CRM от корня

This commit is contained in:
EugeneTes
2026-10-16 07:40:40 +00:00
parent f6b9f03ed7
commit ec2f094f48
5 changed files with 24 additions and 11 deletions

View File

@@ -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: <publishable key>`, `Authorization: Bearer <token>`) и сверяет `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>` (только разрешённые origin CRM), без `X-Frame-Options`.
- Токен не логировать ни в браузере, ни на сервере. Сессию держать в памяти.
- Publishable-ключ Supabase агент получает от Ланы и записывает в свой CLAUDE.md (ключ публичный по дизайну).
- Без открытого токена в ответе страницы: показываем только имя, email, id, origin, `expires_at`.