Перейти к основному содержимому

Авторизация

Поток

MAX Messenger (WebView)
│ window.WebApp.initData (подписанная строка)

Мини-приложение
│ sdk.init(initData)

Backend MAXSCRM
│ POST /api/v1/auth/max
│ проверка подписи HMAC-SHA256 → JWT (orgId внутри)

SDK хранит JWT в памяти, автоматически обновляет

Проверка подписи initData

initData — строка key=value&... (параметры отсортированы), подписанная секретным ключом бота:

secret_key = HMAC_SHA256("WebAppData", botToken)
signature = HMAC_SHA256(secret_key, отсортированные key=value)

Требования:

  • auth_date не старше 1 часа;
  • подпись совпадает;
  • приложение работает только с initData из своего бота.

JWT

POST /api/v1/auth/max с { initData } возвращает:

{
"accessToken": "...",
"refreshToken": "...",
"user": { "id": "...", "orgId": "...", "role": "admin", "name": "..." }
}
  • orgId встроен в JWT — тенант изолирован автоматически;
  • access-токен подставляется SDK во все запросы;
  • refresh-токен одноразовый (ротация, защита от replay).

Dev-режим

Для локальной разработки доступен dev-вход:

curl -X POST http://localhost:3000/api/v1/auth/dev \
-H "Content-Type: application/json" \
-d '{"maxUserId":"1","orgSlug":"default"}'

Первый пользователь организации получает роль admin.

Правила

  • Не вызывайте window.WebApp.* напрямую из приложения — используйте sdk.init() и sdk.bridge;
  • Не храните initData в своём хранилище — он одноразовый для сессии;
  • Не делайте прямых HTTP-запросов к API — только через SDK (прямые вызовы блокируются CSP и отклоняются на ревью).