Документация на Flussonic Media Server

  1. Быстрый старт
  2. How To
  3. Потоковое вещание
    1. Публикация
    2. Прием мультикаста
    3. Варианты источников
    4. Переключение источников
    5. Плейлисты
    6. Наложение логотипа
    7. Миксер
    8. WebRTC публикация
    9. SDI
    10. Отправка на другие сервера
    11. Распознавание DVB субтитров
  4. Транскодер
    1. Логотип
    2. Hardware
    3. Скриншоты
    4. Мозаика
  5. DRM
    1. Simple CAS
    2. Conax DRM
    3. BuyDRM (KeyOS)
  6. Авторизация
    1. Конструктор бэкендов
    2. Сервис сбора статистики
    3. Domain lock
    4. Middleware
    5. Secure links
    6. Ограничение сессий
    7. Мультиавторизация
    8. Бан IP адресов
    9. DVR
    10. Aliaser
  7. API
    1. HTTP API
    2. Events API
    3. MySQL API
    4. SQL API для кластеров
    5. SNMP
  8. Кластер
    1. Ретрансляция
    2. Кластерный захват
    3. Балансировщик нагрузки
    4. Пиринг
    5. Организация CDN
  9. VOD
    1. Кэш
    2. Облако
    3. Транскодирование файлов
  10. DVR
    1. Настройка
    2. Timeshift
    3. Catchup
    4. Проигрывание
    5. Экспорт в MP4
    6. Доступ по протоколам
    7. Timelapse
    8. API
    9. Кластеризация DVR
    10. Репликация
    11. Облако
  11. Воспроизведение
    1. HLS
    2. embed.html
    3. HTML5 с низкой задержкой
    4. Плеер HTML5 с низкой задержкой
    5. MPEG-TS
    6. RTMP
    7. DASH
    8. HDS
    9. RTSP
    10. multicast, CBR UDP
    11. WebRTC проигрывание
    12. H.265
  12. Администрирование
    1. Установка
    2. Обновление

    3. Конфигурация
    4. Мониторинг
    5. Производительность
    6. Лицензия
    7. LUA скрипты
    8. Безопасность
    9. Let's Encrypt
    10. Миграция
  13. IPTV
    1. Захват спутникового видео
    2. Транскодирование
    3. Middleware в IPTV OTT
    4. Экспорт EPG со спутника
    5. Группы каналов

Защита доступа к потокам (Авторизация по токену)

В этой статье приведен пример того, как можно реализовать систему авторизации без написания собственного бэкенда.

Схема работы авторизации:

  1. Ваш сайт генерирует токен по несложной формуле и хеширует его с помощью секретного ключа.
  2. Клиент открывает поток с полученным токеном.
  3. Flussonic генерирует токен по той же формуле, используя тот же ключ (и дополнительно используя имя потока и IP адрес клиента).
  4. Хеши совпали — доступ разрешен. Не совпали — запрещен.

Настройка Flussonic для использования авторизации по токену Anchor Anchor x2

В поставке Flussonic есть файл со всей необходимой логикой (скрипт 'securetoken'). Нужно лишь указать путь к нему в директиве auth:

stream example-stream {
  url fake://fake;
  auth securetoken://SECRETKEY;
}

Можно включить авторизацию (директиву auth) как для одного потока, так и глобально.

Код для сайта Anchor Anchor x2

Чтобы сгенерировать токен, Flussonic должен знать следующее:

  • IP-адрес клиента
  • Имя потока
  • Секретный ключ
  • Текущее время

Код на сайте должен собрать в одну строку эти данные:

string = streamname + ip + starttime + endtime + secretkey + salt

И получить токен по формуле:

sha1(string) + salt + endtime + starttime.

Где:

  • ip — IP адрес клиента.
  • name — название потока.
  • starttime — обычно это текущее время UTC (в Unix Timestamp).
  • endtime — время окончания жизни токена, обычно это текущее время + несколько часов. По прошествии этого времени токен перестанет работать и его надо будет запрашивать заново.
  • secretkey — это ключ, указанный в файле /etc/flussonic/flussonic.conf.
  • salt — строка из случайных символов, необходима, чтобы для одинаковых входных данных генерировались разные токены.

PHP пример Anchor Anchor x2

<?php

$flussonic = 'http://flussonic-ip'; // flussonic address
$key = 'SECRETKEY'; // key from flussonic.conf file. KEEP IT IN SECRET
$lifetime = 3600 * 3; // 3 hours after link will be invalid

$stream = $_GET['stream']; // this script get streamname from a query string (script.php?stream=bbc)

$ipaddr = $_SERVER['REMOTE_ADDR'];
$desync = 300; // allowed time desync between flussonic and hosting servers in seconds
$starttime = time() - $desync;
$endtime = $starttime + $lifetime;
$salt = bin2hex(openssl_random_pseudo_bytes(16));

$hashsrt = $stream.$ipaddr.$starttime.$endtime.$key.$salt;
$hash = sha1($hashsrt);

$token = $hash.'-'.$salt.'-'.$endtime.'-'.$starttime;
$link = $flussonic.'/'.$stream.'/embed.html?token='.$token;
$embed = '<iframe allowfullscreen style="width:640px; height:480px;" src="'.$link.'"></iframe>';

echo $embed;

Rails пример Anchor Anchor x2

config/routes.rb:

Rails.application.routes.draw do
 ...
  get '/securetoken/:id', to: 'securetoken#index'
end

app/controllers/securetoken_controller.rb:

class SecuretokenController < ApplicationController

  def index

    flussonic = 'http://flussonic-ip'
    secret = 'SECRETKEY'

    streamname = params[:id]
    lifetime = 3600 * 3
    starttime = Time.now.to_i - 300
    endtime = Time.now.to_i + lifetime
    salt = rand(8**8).to_s(8)

    hash = Digest::SHA1.hexdigest(streamname + request.remote_ip + starttime.to_s + endtime.to_s + secret + salt)
    token = hash + '-' + salt + '-' + endtime.to_s + '-' + starttime.to_s
    @url = flussonic + '/' + streamname + '/' + 'embed.html?token=' + token
  end
end

app/views/securetoken/index.html.erb:

<iframe allowfullscreen style="width:640px; height:480px;" src="<%= @url %>"></iframe>