如何将AWS Signature Version 4与AWS Javascript SDK一起使用以从浏览器上传到S3?

时间:2015-11-10 16:00:46

标签: amazon-web-services amazon-s3 aws-sdk

我需要能够从用户的浏览器上传大型(1 + gb)文件到S3。由于大小和负载限制,通过应用程序服务器(PHP)发送它们根本不是一个选项。

我想使用AWS Javascript SDK执行此操作,如下所示:http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Uploading_a_local_file_using_the_File_API

问题是,仅Javascript SDK(正式)列出了一些身份验证方法,并且不清楚如何使SDK使用“AWS Signature V4”身份验证,如下所示:http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html < / p>

问题是: 您可以将“Signature V4”与“AWS JS SDK”一起使用吗?

编辑:听起来好像我需要使用“安全令牌服务”:http://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html任何人都可以确认这是否是正确的方法?

可能相关的更多细节: 我的用例位于在线商店的管理区域,其中管理员用户已通过登录管理部分进行了身份验证,但仍无法查看主AWS密钥。 AWS JS SDK允许您通过Facebook或其他ID提供商进行身份验证,但由于管理员已经登录,这将是一种奇怪的用户体验。

由于此功能必须打包到单个模块中以便安装在电子商务平台(Magento)中,因此要求安装人员也可以使用单独的凭据创建新的IAM角色,仅用于上传器功能。

3 个答案:

答案 0 :(得分:3)

要将文件从浏览器上传到S3,您可以使用预先签名的PUT。这样您就不会向浏览器公开aws的秘密。您可以使用minio-js库生成预先签名的PUT URL。

在服务器端,您可以像这样生成预先签名的PUT URL:

var Minio = require('minio')

// find out your s3 end point here:
// http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

var s3Client = new Minio({
    endPoint: 's3.amazonaws.com',
    accessKey: 'YOUR-ACCESSKEYID',
    secretKey: 'YOUR-SECRETACCESSKEY'
})
var presignedUrl = s3Client.presignedPutObject('bucket', 'object', 24*60*60)
// presignedUrl expires in 1 day

您可以将此预先签名的URL传递给浏览器,该浏览器只需对亚马逊s3执行简单的HTTP PUT即可。 PUT请求将成功,因为签名将是presignedUrl的一部分。

您也可以使用预先签名的POST上传。

答案 1 :(得分:0)

您有2个选项,因为硬编码凭据永远不是一个好选择。

  1. Amazon Cognito
  2. Web Identity Federation
  3. 我建议您利用AWS Cognito和开发人员身份验证身份来利用AWS SDK for JavaScript。您注意到的场景正是Cognito旨在解决的问题。您可以让管理员使用您自己设计的auth方法登录系统,但是使用该授权通过Cognito生成可用于对所有AWS服务进行身份验证的令牌。

    有关这两种方案的示例,请查看AWS JavaScript开发人员指南:在客户端浏览器中加载凭据:http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-configuring.html#Loading_Credentials_in_the_Client_s_Browser

    可能也有助于您的参考资料:

    Amazon Cognito开发者身份验证身份:http://docs.aws.amazon.com/cognito/devguide/identity/developer-authenticated-identities/

    身份提供商和联盟:http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html

    AWS SDK for JavaScript开发人员指南:http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/index.html

答案 2 :(得分:-1)

在接受的答案中添加更多信息,您可以使用AWS Signature第4版参考我的博客,查看代码的运行版本。

总结一下:

用户选择要上传的文件后,请执行以下操作:

  1. 拨打网络服务器以启动服务以生成所需的参数

  2. 在此服务中,调用AWS IAM服务以获得临时信用

  3. 获得cred后,创建一个存储桶策略(base 64编码的字符串)。然后使用临时秘密访问密钥对存储桶策略进行签名,以生成最终签名

  4. 将必要的参数发送回用户界面

  5. 收到此消息后,创建一个html表单对象,设置所需的参数并将其POST。

  6. 有关详细信息,请参阅https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/