Интеграция: билеты 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 в политике авторизации: как только он выставлен, любой не-билетный токен отклоняется сразу, без обращения к спискам и бэкенду, и колбэк-путь закрыт окончательно.
Что дальше¶
- Защита воспроизведения — та же политика глазами оператора.
- Жизненный цикл сессии — как билетная сессия открывается, закрывается и переживает сбой в кластере.
- flussonic-авторизация — колбэк-путь, с которого вы мигрируете.