Я работаю над проектом, в котором мне нужно будет воспроизвести зашифрованный видеофайл HLS (.m3u8). Я использую CloudFront и подписанные файлы cookie для защиты контента. Я могу воспроизводить файл .m3u8 без подписанных файлов cookie, но когда я использую подписанные файлы cookie, файлы cookie не отправляются в запросах.
Я использую альтернативный домен для распространения CloudFront и подтверждаю, что, кроме файла .m3u8, я могу получить доступ ко всем другим файлам с помощью подписанных файлов cookie.
После исследования я обнаружил, что если установить withCredentials
в значение true, как в следующем коде, подписанные файлы cookie будут отправлены в запросе:
player.ready(function() {
player.src({
src: 'https://protected.example.com/output-plain/art.m3u8',
type: 'application/x-mpegURL',
withCredentials: true
});
});
Этот код работает, и подписанные файлы cookie отправляются по запросу, однако я начал получать новую ошибку:
Access to XMLHttpRequest at 'https://protected.example.com/output-plain/art.m3u8undefined' from origin 'https://example.com' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
Затем я обнаружил, что должен установить Access-Control-Allow-Credentials
в значение true. однако это не работает для меня.
Я использую библиотеку video.js, я также пробовал hls.js и получаю ту же ошибку и застреваю в том же месте.
Я застрял в этой проблеме в течение последних 7 дней, и я думаю, что документы AWS действительно ошеломляют, я отправил много вопросов по SO и проблемам на Github, но до сих пор не повезло. Надеюсь, здесь мне кто-нибудь поможет.
Вот скриншот поведения раздачи CloudFront:
А вот мой код php и js; индекс.php:
<?php
header("Access-Control-Allow-Origin: https://protected.example.com");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");
?>
<!DOCTYPE html>
<html>
<head>
<link href="https://vjs.zencdn.net/7.10.2/video-js.css" rel="stylesheet" />
</head>
<body>
<video
id="video_player"
class="video-js"
controls
preload="auto"
poster="//vjs.zencdn.net/v/oceans.png"
data-setup='{}'
width=600 height=300>
</video>
<script src="https://vjs.zencdn.net/7.10.2/video.js"></script>
<script>
var player = videojs('video_player')
player.responsive(true);
player.ready(function() {
player.src({
src: 'https://protected.example.com/output-plain/art.m3u8',
type: 'application/x-mpegURL',
withCredentials: true
});
});
</script>
</body>
</html>
Вот политика CORS с поддержкой S3:
[
{
"AllowedHeaders": [
""
],
"AllowedMethods": [
"POST",
"GET",
"PUT",
"HEAD"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
Заранее спасибо.