何时生成预先签名的网址

时间:2016-10-14 19:58:19

标签: ios amazon-s3 boto3

我有一个tableview,可以从Heroku上的postgres数据库中获取数据。 tableview的每个单元表示存储在S3上的音频文件。我使用postgres为每个单元格返回的trackID来创建一个如下所示的URL来访问音频文件:

 let audioURL = "https://s3.amazonaws.com/<bucketname>/<trackID>.m4a"
 self.player!.audioPlayer = try AVAudioPlayer(contentsOf: audioURL)

这将导致错误,因为我无法直接访问S3文件。我相信我需要pre-signed urls boto3才能对文件提出GET请求。我是否应该在选择播放文件时生成预先签名的网址,还是在制作原始获取请求时是否应该为每个文件获取预先签名的网址?

2 个答案:

答案 0 :(得分:0)

预先签名的网址有一个到期时间,默认为boto3中的一小时。在选择文件时生成它们可能会更好。

答案 1 :(得分:0)

Pre-Signed URL是一种提供对存储在Amazon S3中的私有对象的临时访问的方法。

预签名网址包含:

  • 文件网址
  • 与有权获取文件的用户相关联的访问密钥
  • 到期时间戳
  • 基于授权用户的密钥(与其访问密钥匹配)的散列签名

预先签名的网址可以从几行代码生成,只有当GET请求发送到Amazon S3时才评估

使用Amazon S3获取网页的对象时,应在服务器端生成预签名的URL,以便不将凭据发送到客户端。因此,预生成的URL将在生成HTML时生成。

但是,您似乎正在为 iOS 编码。因此,有两种可能的情况:

  • 您可以使用AWS Security Token Service生成临时AWS凭证,并且有权在凭据期间访问S3中的所有相关内容,或
  • 您可以让iOS应用向后端发送文件的请求,然后后端检查用户是否有权访问该文件,如果是,则返回Amazon S3预先签署了该文件的URL。

第一种方法是通过允许iOS应用程序直接从Amazon S3请求内容来减少后端服务器上的负载。第二种方法提供了在授予访问权限之前检查每个文件访问的能力,并且具有可以轻松记录每个请求的好处。