Skip to content

Интеграция: билеты Catena

Эта страница — для разработчика витрины или биллинга, того места, где вы продаёте доступ. Вместо того чтобы отвечать на колбэк по каждому зрителю, вы создаёте сессию заранее и выдаёте зрителю билет. Стример допускает билет сам: проверяет подпись, срок и область действия локально, без обращения к вашим системам на пути воспроизведения.

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

Создать грант

Продавая доступ, вызовите management API и создайте грант. Catena подпишет билет (JWT) и вернёт его — токен отдаётся только при создании; реестр хранит грант, а не билет.

Авторизуйте вызов так же, как любой запрос к management API, — админскими логином и паролем. Чтобы витрине не держать полных админских доступов, можно вместо этого настроить в central отдельный issuer-ключ — bearer-токен, единственная сила которого выдавать и вести гранты, — и слать его в заголовке Authorization: Bearer <issuer-ключ>.

POST /play-sessions/grants
{
  "streams": ["news", "arena"],
  "user_id": "subscriber-4821",
  "ttl_secs": 14400,
  "max_concurrent": 2,
  "bind_ip": "203.0.113.0/24",
  "note": "family plan"
}
Поле Значение
streams Какие каналы может играть билет — его область действия
user_id Учётка, которой принадлежит билет; группирует экраны зрителя
ttl_secs Срок жизни билета; по умолчанию 4 часа. exp — жёсткий конец: сессия не может его пережить (плееры не обновляют токен)
max_concurrent Одновременных экранов; по умолчанию 1, null — безлимит
bind_ip Необязательный IP или CIDR, вне которого билет бесполезен
note Необязательная текстовая пометка

В ответе — грант и token. Отдайте этот токен плееру, он предъявляет его в ссылке воспроизведения как ?token=<jwt> (или в заголовке Authorization: Bearer). Больше от зрителя ничего не нужно — дальше всё делает стример.

Экраны

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

PATCH /play-sessions/grants/{jti}
{ "max_concurrent": 3 }

Отзыв

Отмените грант — и каждый стример за секунды сбрасывает его зрителей и дальше билет не пускает: отмена доезжает до стримеров по каналу отзывов, а не ждёт, пока билет истечёт. Переавторизации у билетных сессий нет; отзыв — единственный канал, который завершает их досрочно.

Роуминг

Зритель, у которого меняется адрес (телефон уходит из Wi-Fi в мобильную сеть), заново допускается на новом адресе, офлайн, а старая сессия гаснет по idle-таймауту. Это считается одним просмотром, а не новым списанием, и группируется по гранту. Если вы задали bind_ip, роуминг остаётся в пределах этого диапазона.

Листинг и статус

GET /play-sessions/grants перечисляет гранты и их статус — issued (выдан, ещё не играл), played (сыграл хотя бы раз), revoked, expired, — с фильтром по user_id и статусу. Это запись того, что вы продали и было ли оно использовано.

Мигрируйте в своём темпе

Билеты и существующий бэкенд работают бок о бок — билеты для одних зрителей, колбэк для других, — так что переходить можно аудитория за аудиторией. Финал — переключатель opaque_tokens: false в политике авторизации: как только он выставлен, любой не-билетный токен отклоняется сразу, без обращения к спискам и бэкенду, и колбэк-путь закрыт окончательно.

Что дальше