我花了很多时间寻找答案,相信我,我尝试了一切。 我正在运行一个 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-mpegURL
或 vnd.apple.mpegURL
)。
最后一点,您应该使用签名 token 以避免重复使用。
关于php - nginx - 尝试通过 auth_request 保护 HLS 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44157703/