我有一个正在播放存储在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];
[您需要生成Cookie,很遗憾,aws ios sdk没有此功能。我目前的临时解决方案是以下解决方案之一:
1)要求Web服务器生成cookie(使用aws php sdk)。这样,您可以在几分钟内或您希望的任何时间设置超时,从而可以确保数据安全。
2)在代码内部对Cookie进行硬编码。您可以使用aws php sdk在本地生成它,然后设置尽可能长的持续时间。可能一年或更长时间取决于您的状况。但是,如果有人可以看到,您的数据将被公开。
3)在swift / obj-c中创建我们自己的cookie生成器函数。我们可以使用aws php sdk作为参考。