我需要能够从用户的浏览器上传大型(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角色,仅用于上传器功能。
答案 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个选项,因为硬编码凭据永远不是一个好选择。
我建议您利用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版参考我的博客,查看代码的运行版本。
总结一下:
用户选择要上传的文件后,请执行以下操作:
拨打网络服务器以启动服务以生成所需的参数
在此服务中,调用AWS IAM服务以获得临时信用
获得cred后,创建一个存储桶策略(base 64编码的字符串)。然后使用临时秘密访问密钥对存储桶策略进行签名,以生成最终签名
将必要的参数发送回用户界面
收到此消息后,创建一个html表单对象,设置所需的参数并将其POST。
有关详细信息,请参阅https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/