# Вход в публичном приложении

> Как сделать свою регистрацию и вход в приложении с уровнем «Любой по ссылке».

> Оглавление всей документации: https://docs.getxflow.com/llms.txt

На уровне «Участники проекта» xflow сам знает, кто открыл приложение, ничего делать не
нужно. На уровне «Любой по ссылке» платформа посетителя не узнаёт: регистрацию, вход и права
делает само приложение через свои [функции](https://docs.getxflow.com/platform/functions.md). Эти функции открыты всему
интернету.

## Пароли

- Хранить только хеш: `crypto.scrypt` со своей солью на каждого пользователя, сравнивать
  через `crypto.timingSafeEqual`.
- Пароль не пишут в логи, не возвращают и не держат в браузере.
- Неудачные входы считают по почте и по `event.xflow.ip` и притормаживают.

## Сессия

- После входа функция создаёт случайный токен (`crypto.randomBytes(32)`), хранит в таблице его
  SHA-256 и срок, а сам токен отдаёт в ответе.
- Приложение держит токен в `localStorage` и шлёт в заголовке `X-Session`. Куки не работают:
  платформа их не пропускает.
- Срок несколько часов, каждый вызов его продлевает. Выход и смена пароля удаляют сессии.
- Токен не кладут в адрес (`?session=`): он останется в истории.
- Свой заголовок вроде `X-Session`, а не `Authorization` и не служебные заголовки платформы:
  их она заменяет или вырезает.

## Каждая функция

Функция, которая отдаёт данные вошедшему, читает `X-Session` из `event.headers`, находит
сессию и фильтрует строки по пользователю в SQL. Спрятанная кнопка не защищает.

В коде приложения не бывает ключей, списка пользователей, хешей и проверки роли как
единственной защиты.

## Письма

Платформа не отправляет письма за приложение. Для подтверждения почты и сброса пароля нужен
почтовый сервис, его ключ кладут в `xflow env set`.

## Проверка

`xflow dev` не передаёт `X-Session` и зовёт функции от вашего имени. Вход проверяют на адресе
приложения.
