Ссылка для входа в Speak с ролью администратора
Kinescope позволяет заранее задать роль участника в ссылке на комнату Speak. Вы подписываете JWT-токен (JSON Web Token) на своём сервере и добавляете его к ссылке — человек открывает её и попадает в комнату сразу администратором.
Это значит, что вам не нужно выдавать права вручную в интерфейсе: роль приходит вместе со ссылкой, а решение о том, кому её отправить, принимает ваша система.
Кому подходит эта статья
- Разработчикам платформ — нужно выдавать ссылки на встречи из LMS, CRM или личного кабинета
- Backend-разработчикам — требуется подписывать токены с ролью на своей стороне
- Интеграторам вебинаров — нужно, чтобы ведущий заходил в комнату с полными правами
Когда вам нужна ссылка с ролью для Speak
Вот типичные ситуации, когда это пригодится:
- Ведущий заходит из вашего интерфейса — преподаватель нажимает «Начать урок» в вашей системе и попадает в комнату администратором
- Автоматическая рассылка ссылок — расписание встреч живёт в вашей системе, и ссылки для ведущих генерируются без участия человека
- Несколько ведущих в одной комнате — правами управляет ваша система, а не владелец комнаты
- Без ручной выдачи прав — никто не назначает роли в интерфейсе Speak перед каждой встречей
Если хотя бы один из этих сценариев вам знаком — читайте дальше.
Как работает вход по ссылке с ролью (4 шага)
Схема та же, что и в чате трансляций: асимметричная криптография RSA, приватный ключ остаётся у вас.
- Вы создаёте пару ключей (приватный и публичный) на вашем сервере
- Публичный ключ сохраняется в Kinescope через API (приватный остаётся только у вас)
- Ваш сервер создаёт JWT-токен с полями
aud,room_idиroleи подписывает его приватным ключом - Пользователь открывает ссылку с токеном — Kinescope проверяет подпись публичным ключом и пускает его в комнату с указанной ролью
Теперь разберём, как это настроить.
Шаг 1 — ключи для подписи
Ключи для Speak генерируются и сохраняются точно так же, как для чата трансляций. Если вы уже настраивали JWT для чата, переходите сразу к шагу 2 — новый ключ не нужен.
Что нужно сделать:
- Сгенерировать пару ключей RSA и подготовить публичный ключ в формате JWK — генерация ключей
- Сохранить публичный ключ в Kinescope через
POST /v1/jwk— сохранение публичного ключа - Проверить список активных ключей при необходимости — управление ключами
aud внутри него, а не по ключу.Шаг 2 — токен для Speak
Создайте JWT-токен и подпишите его приватным ключом по алгоритму RS256. Идентификатор ключа передайте в заголовке токена в поле kid.
Обязательные поля
aud(audience) — значение"speak". По нему Kinescope понимает, что токен предназначен для видеовстречи, а не для чата.room_id— код комнаты из её ссылки, напримерjqi-qhua-glk. Должен совпадать с кодом в адресе, по которому пойдёт пользователь.role— роль участника. Сейчас поддерживается значение"admin"— участник получает права администратора комнаты.
Где взять код комнаты: он стоит в конце ссылки на комнату в интерфейсе Speak. Через API его вернут поля code и link в ответе GET /v1/speak/rooms — смотрите справочник API
.
Стандартные JWT-поля (рекомендуется)
Добавьте exp, iat и nbf — они работают так же, как в чате трансляций, и проверяются при валидации токена. Подробности — в разделе стандартные JWT-поля
.
Пример payload
{
"aud": "speak",
"room_id": "jqi-qhua-glk",
"role": "admin",
"iat": 1703500800,
"exp": 1703504400
}
Пример генерации токена
package main
import (
"crypto/rsa"
"time"
"github.com/golang-jwt/jwt/v5"
)
type SpeakClaims struct {
RoomID string `json:"room_id"` // код комнаты из ссылки
Role string `json:"role"` // admin
jwt.RegisteredClaims
}
// Генерация токена для входа в комнату Speak
func generateSpeakJWT(privateKey *rsa.PrivateKey, kid, roomID, role string) (string, error) {
now := time.Now()
claims := SpeakClaims{
RoomID: roomID,
Role: role,
RegisteredClaims: jwt.RegisteredClaims{
Audience: []string{"speak"}, // обязательно "speak"
IssuedAt: jwt.NewNumericDate(now),
ExpiresAt: jwt.NewNumericDate(now.Add(1 * time.Hour)),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodRS256, claims)
token.Header["kid"] = kid // Key ID сохранённого в Kinescope публичного ключа
return token.SignedString(privateKey)
}
Общая механика подписи и примеры библиотек для других языков — в разделе пример генерации JWT .
Ссылка для входа
Добавьте готовый токен к ссылке на комнату параметром token:
https://speak.kinescope.io/{{room_code}}?token={{jwt}}
Пример:
https://speak.kinescope.io/jqi-qhua-glk?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleS0yMDI0LTEyLTI1In0.eyJhdWQiOiJzcGVhayIsInJvb21faWQiOiJqcWktcWh1YS1nbGsiLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE3MDM1MDA4MDAsImV4cCI6MTcwMzUwNDQwMH0.signature_here
Готово! Теперь участник, открывший такую ссылку, попадёт в комнату с ролью администратора.
Безопасность
admin даёт полные права в комнате. Выдавайте такие ссылки только тем пользователям, которых ваша система уже авторизовала, и не публикуйте их в открытом доступе. Ссылка с токеном — это и есть пропуск: любой, кто её получит, войдёт администратором.Что стоит соблюдать:
- Короткий срок жизни токена — ставьте
expна время, близкое к длительности встречи, а не на месяцы вперёд - Генерация на бэкенде — приватный ключ не должен попадать в браузер или мобильное приложение
- Никаких токенов в логах и аналитике — ссылка с токеном не должна утекать в системы, где её увидят посторонние
- Отдельная ссылка на каждого ведущего — так проще отозвать доступ и разобраться, кто чем воспользовался
Регламент обновления ключей и действия при утечке приватного ключа описаны в статье про чат: ротация ключей и действия при компрометации ключа .
Решение проблем
Токен не принимается системой
Проблема: пользователь открывает ссылку, но не попадает в комнату или заходит без роли администратора.
Проверьте по порядку:
- Поле
aud— должно быть строго"speak"в нижнем регистре. Токен для чата ("chat") в Speak не подойдёт. - Поле
room_id— код комнаты в токене должен совпадать с кодом в адресе ссылки. Например, дляhttps://speak.kinescope.io/jqi-qhua-glkв токене нужен"room_id": "jqi-qhua-glk". - Поле
role— значение"admin"в нижнем регистре. - Срок действия токена — проверьте
expи синхронизацию системного времени на сервере (NTP). - Публичный ключ — он должен быть загружен в Kinescope, не истёкшим, а токен подписан парным ему приватным ключом по алгоритму RS256.
Проверить структуру и подпись токена локально до отправки пользователю поможет пример из раздела как проверить валидность токена . Частые ошибки при работе с ключами разобраны там же, в разделе решение проблем .
Если проблема не решилась, напишите в техническую поддержку и приложите код комнаты, пример токена (чувствительные данные можно замаскировать) и описание шагов воспроизведения.
Что дальше?
После настройки ссылок с ролью рекомендуем:
- Что такое Speak — возможности видеовстреч и запись в каталог
- JWT-аутентификация для чата трансляций — тот же механизм ключей для чата
- Справочник API по Speak — создание комнат, участники и звонки
Остались вопросы? Напишите в чат поддержки — специалисты помогут!