nginx - 尝试通过auth_request保护HLS流

时间:2017-05-24 11:54:40

标签: php nginx hls m3u8

我花了很多时间寻找答案,相信我,我尝试了一切。 我正在运行一个将rtmp流推送到HLS流的nginx服务器。

以下是我的nginx.conf

的一部分
location /hls {
        types {
            application/vnd.apple.mpegurl m3u8;
        }

        root /mnt/;
        set $auth_request_uri "http://SERVER:8000/auth_ext.php?token=$arg_token";
        auth_request /auth/;
        add_header Cache-Control no-cache; # Prevent caching of HLS fragments
        add_header Access-Control-Allow-Origin *; # Allow web player to access our playlist
    }

location /auth/ {
        internal;
        proxy_pass              $auth_request_uri;
        proxy_pass_request_body off;
        proxy_set_header        Content-Length "";
        proxy_set_header        X-Original-URI $request_uri;
    }

我正在尝试通过php页面验证流,我从URL获取参数,然后如果它与我的数据库中的令牌匹配则响应200 OK。

到目前为止,我设法进行身份验证,这意味着如果令牌匹配,我可以访问http://SERVER:8080/hls/stream.m3u8?token=TOKEN,但这是发生的事情。

我有一个主m3u8流,可以根据带宽调整流,当我在控制台中访问stream.m3u8时,我看到了这个

 http://SERVER:8080/hls/stream.m3u8?token=TOKEN
 http://SERVER:8080/hls/stream_mid.m3u8
 http://SERVER:8080/hls/stream_hd720.m3u8
 http://SERVER:8080/hls/stream_src.m3u8

其中最后三个m3u8响应404,因为参数没有通过,因此我有一个永不加载的流,但URL确实响应。 此外,在m3u8本身,.ts文件也获得404。

如何解决这个问题,每当第一次调用第一个m3u8时,可以访问剩余的m3u8和ts文件,或者返回200个代码?

我真的希望自己明确表示,我可以提供更多细节

谢谢大家

1 个答案:

答案 0 :(得分:0)

不会在请求之间共享身份验证结果。您必须为所有变体播放列表媒体片段的每个新请求提供相同的令牌。

要实现此目的,您必须重写主HLS清单和变体HLS清单,并将令牌添加到每个包含的URL。一种解决方案是使用PHP包装器拦截所有.m3u8个请求,解析播放列表并即时添加令牌,然后返回具有正确MIME类型(application/x-mpegURL或{{1}的结果}})。

作为最后一点,您应该使用签名令牌以避免重复使用。