Регистрация, вход, подтверждение почты, профиль, адреса доставки и устройства. Нужно, если вы делаете свою витрину: гость проходит путь до оплаты без входа, но история заказов, избранное и бонусы — уже за входом. Общее для всего раздела: любой эндпоинт с заголовком X-CSRF-Token может ответить 403 {"error":"Неверный или отсутствующий CSRF-токен"} либо 403 {"error":"Недопустимый Origin"} — это не описано у каждого эндпоинта отдельно, чтобы не повторяться.
После входа платформа ставит две куки: короткоживущую для доступа и долгую для продления. Токен в теле ответа не возвращается намеренно — так его не сможет прочитать посторонний скрипт на странице.
Все запросы отправляйте с credentials: "include". Если витрина и API на разных доменах, без этого браузер не приложит куки, и вход будет «слетать» на каждой перезагрузке.
Любой изменяющий запрос требует заголовка X-CSRF-Token — возьмите его один раз через GET /auth/csrf и держите в памяти приложения. Это защита от того, чтобы чужой сайт отправил запрос от имени вашего покупателя, пользуясь его куками.
Ответ 403 с упоминанием CSRF почти всегда означает, что ключ устарел: возьмите новый и повторите запрос.
Короткий доступ живёт недолго, и рано или поздно любой запрос вернёт 401. Правильная реакция: вызвать POST /auth/refresh и повторить исходный запрос. Если и refresh ответил 401 — сессии больше нет, показывайте форму входа. Повторять его в цикле бессмысленно.
Регистрация привязывает человека к тому магазину, где он зарегистрировался. Один и тот же адрес почты может быть заведён в разных магазинах платформы — это разные учётные записи с разной историей заказов.
Поэтому заголовок X-Site-Source обязателен при регистрации, входе и восстановлении пароля.
Регистрация, вход, подтверждение почты, профиль, адреса доставки и устройства. Нужно, если вы делаете свою витрину: гость проходит путь до оплаты без входа, но история заказов, избранное и бонусы — уже за входом. Общее для всего раздела: любой эндпоинт с заголовком X-CSRF-Token может ответить 403 {"error":"Неверный или отсутствующий CSRF-токен"} либо 403 {"error":"Недопустимый Origin"} — это не описано у каждого эндпоинта отдельно, чтобы не повторяться.
Одноразовый ключ, без которого не пройдёт ни один изменяющий запрос.
Доступ:Без авторизации
Возьмите его перед первым POST и держите в памяти приложения. Платформа проверяет его у всех методов, кроме чтения: так чужой сайт не сможет отправить запрос от имени вашего покупателя, даже если браузер приложит его куки.
Магазин берётся из заголовка витрины: покупатель принадлежит тому магазину, где зарегистрировался. Один и тот же адрес почты может быть заведён в разных магазинах платформы — это разные люди с точки зрения данных.
Заголовки
Параметр
Тип
Обязателен
Описание
X-Site-Source
string
да
Код магазина. Без него регистрация отклоняется.
X-CSRF-Token
string
да
Ключ из /auth/csrf.
Тело запроса
Параметр
Тип
Обязателен
Описание
email
string
да
Почта покупателя.
password
string
да
Пароль.
lastName
string
да
Фамилия.
firstName
string
да
Имя.
middleName
string
нет
Отчество.
phone
string
нет
Телефон.
agreedToMarketing
boolean
нет
Согласие на рассылку. Отдельное от согласия на обработку данных.
initData
string
нет
Данные Telegram, если регистрация идёт из мини-приложения.
Ответ содержит профиль, а сам доступ приходит куками: браузер приложит их сам, если вы шлёте запросы с credentials: "include". Токен в теле не возвращается намеренно — так его не сможет прочитать посторонний скрипт на странице.
Заголовки
Параметр
Тип
Обязателен
Описание
X-Site-Source
string
нет
Код магазина. Формально не обязателен — без него запрос не отклоняется, но резолвится в служебный контекст персонала, а не покупателя магазина. Для витрины передавайте всегда.
X-CSRF-Token
string
да
Ключ из /auth/csrf.
Тело запроса
Параметр
Тип
Обязателен
Описание
email
string
да
Почта.
password
string
да
Пароль.
initData
string
нет
Данные Telegram для входа из мини-приложения.
Поля ответа
Поле
Тип
Описание
user
object
Полный профиль покупателя — тот же набор полей, что у GET /auth/profile.
Вызывайте, когда любой запрос вернул 401, и повторяйте исходный запрос. Тело не нужно — всё берётся из кук. Проверка не через обычный auth-миддлварь: маршрут проверяет refresh-куку вручную в самом контроллере, поэтому здесь нет привычного 401 {"error":"Unauthorized"}.
Кука есть, но сессия не проходит проверку (отозвана, не совпадает с записью на сервере).
Показывайте форму входа.
401
{"error":"<текст ошибки из jwt-библиотеки>"}
Долгая кука просрочена или повреждена — текст берётся напрямую из ошибки проверки токена (jwt expired, invalid signature и т.п.), поэтому не постоянный.