如何在iOS上使用.m3u8文件处理CloudFront签名的Cookie?

问题描述 投票:1回答:1

我有一个正在播放存储在AWS上的音频文件的应用程序。音频内容由AWS CloudFront签名的cookie功能保护。创建签名的cookie并使用AVURLAsset将其设置在原始HTTP请求中,我没有任何问题,对于.mp3内容一切正常。但是,访问.m3u8文件时,出现403 HTTP错误。我注意到初始请求是正确的,并且.m3u8文件已正确下载,但是后续请求(用于音频片段)不起作用,并且由于未发送cookie而收到403。

我已经尝试过使用NSHTTPCookieStorage,但是它不起作用;-(

NSURL *url = [NSURL URLWithString: @"http://..../stream.m3u8"]

// Get the Cookie Storage
NSHTTPCookieStorage *cookiesStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

// Create the array to store the cookies
NSMutableArray *cookies = [NSMutableArray array];

// Create the Cloud-Front-Policy Cookie
NSHTTPCookie *cloudFrontPolicyCookie = ... 
[cookies addObject:cloudFrontPolicyCookie];

// Create the Cloud-Front-Signature Cookie
NSHTTPCookie *cloudFrontSignatureCookie = ... 
[cookies addObject:cloudFrontSignatureCookie];

// Create the Cloud-Front-Key-Paid-Id Cookie
NSHTTPCookie *cloudFrontKeyPairIdCookie = ... 
[cookies addObject:cloudFrontKeyPairIdCookie];

// Create the HTTP Header Dictionary
NSMutableDictionary * headers = [NSMutableDictionary dictionary];

// I omitted the cookie creation, but it is ok! I tested using curl on the command line 
NSString *cookieAsHeader = ... 

// Set the header
[headers setObject:cookieAsHeader forKey:@"Cookie"];

// Create the AVURLAsset so that I can use the headers and the cookies
// Notice that I tried using only the headers (which works)!
AVURLAsset * asset = [AVURLAsset URLAssetWithURL:url options:@{@"AVURLAssetHTTPHeaderFieldsKey": headers, AVURLAssetHTTPCookiesKey : [cookiesStorage cookies] }];

// For secured .mp3 files, it works just fine
// but for .m3u8, the content does not play as the first file part receives 403. Notice that the first request (for the .m3u8) works just fine. 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
ios objective-c swift avplayer amazon-signed-cookie
1个回答
0
投票

[您需要生成Cookie,很遗憾,aws ios sdk没有此功能。我目前的临时解决方案是以下解决方案之一:

1)要求Web服务器生成cookie(使用aws php sdk)。这样,您可以在几分钟内或您希望的任何时间设置超时,从而可以确保数据安全。

2)在代码内部对Cookie进行硬编码。您可以使用aws php sdk在本地生成它,然后设置尽可能长的持续时间。可能一年或更长时间取决于您的状况。但是,如果有人可以看到,您的数据将被公开。

3)在swift / obj-c中创建我们自己的cookie生成器函数。我们可以使用aws php sdk作为参考。

© www.soinside.com 2019 - 2024. All rights reserved.