# ✨ Пускать скрипты в API по личным токенам

- **Тип:** feature
- **Категория:** Очередь — Второй способ представиться ставится на готовые владельца и контракт, иначе форма ошибки переписывается дважды.
- **Зачем:** Скрипту недоступны ни браузерная сессия, ни вход у Authelia: домен целиком стоит за прокси, и автоматизировать загрузку нечем.

Запрос без токена не проходит, а скрипт ходит в API по токену, выпущенному
пользователем, и видит ровно его записи.

Половина работы при этом лежит на контуре: домен целиком стоит за `forward_auth`
Authelia, и запрос скрипта не доходит до сервиса вовсе — его отбивает прокси.
Значит адресам API нужно правило, пропускающее их к сервису, а сервис судит
токен сам. Правило живёт в `pet-project-server`, вне этого репозитория.

Токен принадлежит учётной записи и даёт ровно её права: записи, заведённые по
токену, видны владельцу в приложении, и наоборот.

## Затрагивает

- заголовок авторизации у всех адресов приложения `/app/` и его отношение к
  заголовку, который ставит прокси: два способа представиться и один владелец;
- правило Authelia, пропускающее адреса API мимо входа, — в `pet-project-server`;
- таблица токенов: владелец, имя, отпечаток, время выпуска и последнего
  обращения, и её миграция;
- адреса выпуска, перечня и отзыва токена — `/app/me/tokens`;
- `docs/security.md` — второй способ представиться и хранение отпечатка;
- `README.md` — пример вызова API скриптом.

## Критерии приёмки

- Запрос с годным токеном заводит задачу от имени его владельца. Оракул — тест
  API: задача в репозитории с владельцем токена.
- Запрос без токена и с отозванным токеном получает `401` и задачи не заводит.
  Оракул — тест на трёх случаях: нет заголовка, чужая строка, отозванный токен.
- Полное значение токена показывается один раз при выпуске, в базе лежит только
  отпечаток. Оракул — тест: повторное чтение токена отдаёт имя и отпечаток,
  значение отсутствует, плюс поиск значения по логу пуст.
- Токен не попадает ни в журнал, ни в текст ошибки. Оракул — тест приёма с
  токеном: в перехваченном журнале значения нет.

## Рамки

Учётные записи по-прежнему заводит Authelia — свою регистрацию не делаем.
Сроков жизни и областей действия у токена не заводим: он даёт права владельца
целиком. Берётся после `trusted-header-login`: до неё представляться некому, а
она же решает, какому источнику сервис верит. Экрана выпуска здесь
нет — приложения ещё не существует, токен выпускается запросом к API; место
токена на экране настроек заводит `settings-screen`.
