php - nginx - 尝试通过 auth_request 保护 HLS 流

标签 php nginx http-live-streaming m3u8

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

下面是我的 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 获取参数,然后如果它与我的数据库中的 token 匹配,则响应 200 OK。

到目前为止,我成功通过了身份验证,这意味着我可以访问 http://SERVER:8080/hls/stream.m3u8?token=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 代码?

我真的希望我说清楚了,我可以提供更多细节

谢谢大家

最佳答案

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

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

最后一点,您应该使用签名 token 以避免重复使用。

关于php - nginx - 尝试通过 auth_request 保护 HLS 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44157703/

相关文章:

javascript - PHP 通过电子邮件将选定的变量发送给用户

php - 将多维数组插入mysql表

docker - docker-compose 后 Nginx 不运行服务器

android - 在 Android 操作系统不支持 .ts 文件的情况下播放 HLS

html - FFmpeg 将#EXT-X-START 添加到 HLS m3u8 文件

php - 用 while 改变 div 的值

php - 使用 PHP 填充 Pinterest Pin It 按钮

css - 网络服务器 + Chrome v40 + font awesome 不起作用

php - 配置 nginx 服务器以处理来自多个域的请求

ios - 是否可以使用 AVPlayer 缓存 HLS 片段?