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

Вход покупателя по коду

Покупатель входит без пароля: вводит почту, получает письмо с шестизначным кодом и вводит код на сайте. Работает в любом магазине платформы, витрине нужны две мутации Shop API.

  1. Витрина вызывает requestLoginCode(email). Сервер платформы отправляет письмо с кодом.

  2. Покупатель вводит код. Витрина вызывает authenticate со стратегией email_code.

  3. В ответе — текущий пользователь, а в заголовке vendure-auth-token — токен сессии. Сохраните его, как описано в Shop API.

mutation RequestLoginCode($email: String!) {
requestLoginCode(email: $email) {
success
reason
retryAfter
}
}
mutation LoginWithEmailCode($email: String!, $code: String!) {
authenticate(input: { email_code: { email: $email, code: $code } }) {
__typename
... on CurrentUser { id identifier }
... on ErrorResult { errorCode message }
}
}

В SDK это RequestLoginCodeDocument и LoginWithEmailCodeDocument. authenticate отправляйте в текущей сессии покупателя: вход привязывается к ней, и корзина гостя переходит в аккаунт.

Код доказывает, что почта принадлежит покупателю, поэтому:

  • есть аккаунт с этой почтой — вход в него;
  • человек раньше заказывал гостем — аккаунт создаётся у того же покупателя, и его прошлые заказы сразу видны в профиле;
  • никого нет — регистрируется новый покупатель.

Отдельной регистрации с паролем витрине не нужно.

Правило Значение
Длина кода 6 цифр
Срок жизни 10 минут
Неверных попыток на код 5, потом код гаснет даже для верного ввода
Действует только последний выданный код, прежние гаснут
Повторное письмо не раньше чем через 60 секунд
Писем на одну почту 5 в час и 10 в сутки

Лимиты писем считаются по почте на всей платформе, а не в одном магазине: аккаунт покупателя общий, и раздельные лимиты умножали бы число попыток подбора на число магазинов. В базе хранится только хеш кода с солью.

reason Что значит Что показать
— (success: true) Письмо отправлено Поле для кода
INVALID_EMAIL Почта указана неверно Попросить проверить почту
TOO_SOON Код уже отправлен меньше минуты назад Таймер на retryAfter секунд
TOO_MANY Исчерпан лимит в час или в сутки «Попробуйте позже», retryAfter — через сколько секунд
NOT_CONFIGURED Отправка писем на платформе не настроена Сообщение об ошибке магазина
SEND_FAILED Письмо не ушло «Попробуйте позже»

authenticate с неверным, просроченным или погасшим кодом возвращает INVALID_CREDENTIALS_ERROR.

Тема письма — «123456 — код для входа в <название магазина>». Код — секрет, поэтому письмо всегда уходит с общего адреса платформы от имени магазина, даже если у магазина подключён свой почтовый ящик. Письма о заказах, наоборот, идут со своего ящика магазина, если он подключён.