App runtime

Погасить одноразовый токен запуска слота интерфейса

Единственная дверь, за которой приложение узнаёт, кто из людей кабинета открыл его панель. Зовёт её сервер приложения своим токеном установки, предъявляя одноразовый токен запуска, который оболочка Akeda передала странице сообщением моста.

ЧТО ПРИЛОЖЕНИЕ УЗНАЁТ О ЧЕЛОВЕКЕ: псевдоним, язык и тему. Ни имени, ни почты, ни числового идентификатора, ни ролей. Псевдоним (actor.subject) свой у каждой пары «установка + человек»: он устойчив, поэтому панель помнит выбор конкретного сотрудника, и бесполезен за пределами установки. Числовой идентификатор не отдаётся потому, что реестр людей в Akeda общий на всю платформу — по нему приложение, стоящее в двух кабинетах, связало бы двух разных клиентов между собой. Псевдоним умирает вместе с установкой: после переустановки это для приложения новые люди.

ТОКЕН ОДНОРАЗОВЫЙ и живёт минуту. Он проходит через браузер человека, то есть попадает в код чужой страницы, её консоль и журналы её собственного сервера; многоразовый превратил бы каждый такой след в возможность назваться тем человеком. Второе предъявление отвечает 410 и остаётся в журнале установки отдельной записью — повтор означает либо утечку токена, либо переигрывание запросов приёмником, и разбирают это люди. Не дошедший запуск не чинится повтором: человек открывает панель заново, это одно нажатие.

NONCE придумывает САМА страница расширения и присылает его оболочке сообщением akeda.slot.ready; оболочка запрашивает запуск под этим значением и возвращает его тем же сообщением. Благодаря этому страница отличает ответ на свой запрос от чужого сообщения, посланного ей извне: проверки источника для этого мало — она доказывает, КТО прислал, но не то, что прислано в ответ. Неверный nonce отвечает 400 и живой запуск НЕ сжигает.

Кабинета в адресе нет: он берётся из токена установки. Чужой запуск отвечает 404 — тем же, чем отвечает несуществующий, потому что «есть, но не ваш» рассказало бы о запуске в соседнем кабинете.

КАКИМ ТОКЕНОМ ГАСИТЬ. Сообщение akeda.slot.launch несёт поле tenant — slug кабинета, в котором выдан запуск; тот же slug сервер приложения называет при самовыдаче токена установки (POST /api/v1/app/token). Сервер, обслуживающий много кабинетов, берёт токен установки этого кабинета и не перебирает остальные. Поле — открытая метка, а не доверие: страница могла назвать любой кабинет, и гашение его не читает. Запуск, предъявленный токеном установки другого кабинета, отвечает 404 и живым для своей установки остаётся. Поле может отсутствовать (оболочка прежней версии) — тогда приложение выбирает установку так же, как до его появления.

post/api/v1/app/slot-launch

Request

  • Base URL: https://erp.akeda.ru
  • URL: https://erp.akeda.ru/api/v1/app/slot-launch
  • Auth: HTTP bearer

Headers

X-Tenantstring required

Slug выбранного кабинета; кабинет не является юрлицом

Request body

tokenstring required

Одноразовый токен запуска (al_…), который оболочка передала странице сообщением akeda.slot.launch. Учётными данными не является: без токена установки он не открывает ничего

noncestring required

Значение, которое страница расширения придумала сама и прислала оболочке сообщением akeda.slot.ready. Секретом не является — оно доказывает, что запуск отвечает именно на этот запрос страницы

Response

Контекст запуска: кабинет, слот, псевдоним человека и запись, на которой открыли панель

installation_idstring uuid required
slotstring required

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

noncestring required

Тот же nonce, что прислала страница: по нему сервер расширения связывает погашенный запуск с конкретной рамкой, не веря на слово ей самой

originstring required

Источник, из которого оболочка загрузила рамку. Пусто, если кабинет успел обновить приложение на версию без этого слота: запуск был разрешён по прежнему объявлению и обрывать его незачем

issued_atstring date-time required
redeemed_atstring date-time required
audit_idstring uuid required

Changes

No recorded changes to this operation across all 1 revision of this API.