查看在AWS S3上上传的私有映像 - 从秘密访问密钥创建签名

Ste*_*nou 6 ruby ruby-on-rails amazon-s3

我通过Paperclip gem 在Rails应用程序上上传了一些图像,我只想让后端的管理员能够查看.结果,我将它们设置为私有.

然后我四处寻找解决方案,了解管理员如何通过特定链接查看文件.这是我发现的.

我继续尝试这个,但我正在努力创建所需的签名.公式在上面的链接中给出,是:

Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKeyID, UTF-8-Encoding-Of( StringToSign ) ) ) );

StringToSign = HTTP-VERB + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Expires + "\n" +
    CanonicalizedAmzHeaders +
    CanonicalizedResource;  
Run Code Online (Sandbox Code Playgroud)

我不知道我需要在Ruby on Rails上使用哪个库/模块/ gem.通过搜索我发现了关于aws-s3宝石.我阅读了他们的wiki并看到了"从浏览器访问私有对象".

所以我安装了它们gem,继续打开我的rails控制台并尝试测试它们.我能够与AWS S3建立连接但是我无法做任何事情,因为我收到"uninitialized constant"和"NameError"之类的错误.

任何提示/指导正确的方向是值得赞赏的.

最后请注意,我尝试做的是生成链接,管理员可以使用这些链接在浏览器上查看图像而不下载它们.从我读到的这就是它的作用.但它是肯定还是只是将它们下载到管理员的计算机上?

Fre*_*ung 5

首先,能够在浏览器中查看图像或能够下载图像之间没有区别。无论哪种方式,用户的浏览器都会获取构成图像的字节,并且可以对它们做任何想做的事情。

Amazon 提供 aws-sdk gem 作为访问其服务(包括 s3)的官方支持方式。要生成 s3 预签名 url,您可以执行以下操作

s3 = Aws::S3::Resource.new(region: "us-east-1")
s3.bucket("bucket-name").object("key/for/object").presigned_url("get", expires_in: 3600)
Run Code Online (Sandbox Code Playgroud)

它返回一个有效期为 1 小时的链接(这假设您有实例提供的凭据或具有环境变量AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY凭据。如果不是,则需要在创建资源对象时指定。)


Pau*_*rth 5

由于您使用的是Paperclip,因此您可以使用其expiring_url功能.所以,你可以有一个#show#download只是重定向到URL临时控制器动作.没有必要自己实现它.

我将补充一点,虽然上面的文档建议过期时间为10分钟,但我发现如果服务器的时钟偏向一种方式而S3倾斜另一种方式,则URL可能会在它存在之前到期.所以也许20或30分钟更安全.

显然,如果你添加一个像这样的控制器动作,你应该确保只允许管理员使用它.