如何使用 CloudFront 从 AWS S3 安全地播放 .m3u8 流文件?

Joc*_*acx 5 amazon-s3 amazon-web-services amazon-cloudfront aws-php-sdk

我正在使用 CloudFront 签名 URL 来显示来自 S3 的图像和视频以进行保护。

除了 .m3u8 文件,它适用于图像和其他视频。

我使用了 AWS PHP SDK,这是我的代码。

<?php
    // Instantiate the CloudFront client with your AWS credentials
    $cloudFrontClient    =  new CloudFrontClient(array(
        'region'        => env('AWS_DEFAULT_REGION'),
        'version'       => 'latest',
        'http'          => [ 'verify' => false ],
        'credentials'   => array(
            'key'       => env('AWS_ACCESS_KEY_ID'),
            'secret'    => env('AWS_SECRET_ACCESS_KEY'),
    )));
    
    // Create a signed URL for the resource
    $resourceKey      =  'https://abcdefg.cloudfront.net/test/file_1000k.m3u8';
        $expires          =  time() + 3600;
        $signedUrl        =  $cloudFrontClient->getSignedUrl([
            'url'         => $resourceKey,
            'expires'     => $expires,
            'private_key' => public_path().'/pk-ABCD123.pem',
            'key_pair_id' => 'ABCD123ABCD123ABCD123'
        ]);
?>
    <video id='hls-example' class="video-js vjs-default-skin" width="640" height="480" controls>
        <source src="<?php echo $signedUrl; ?>" type="application/x-mpegURL">
        Your browser does not support the video tag.
    </video>
    
    <script src="https://vjs.zencdn.net/7.2.3/video.js"></script>
    <script src="<?php echo asset('public/assets/js/videojs-contrib-hls.min.js'); ?>"></script>
    <script>
        var player = videojs('hls-example');
        player.play();
    </script>
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,它不会播放,因为我们还需要对 .m3u8 文件中的分段文件 (.ts) 进行签名。

我们如何动态改变它?

有什么办法可以安全播放.m3u8文件,让用户无法使用直接链接访问下载文件?

Chr*_*ams 0

当只有一个文件时,CloudFront 签名 URL 效果很好,但正如您所发现的,当您拥有多个资源时,这是一个问题。

因此,建议的方法是使用签名的 CloudFront cookie

通过执行此操作,您只需签名一次即可允许来自特定 CloudFront 发行版的所有资源,并且无需在每次页面加载时执行签名过程。