[英]Access arbitrary S3 object using amplify-angular
我已经配置了amplify-angular,并且可以用于身份验证和API访问。 使用Angular 5。
我可以访问私有S3资源并利用API访问期间使用的相同身份验证吗?
具体来说,我想对S3对象发出REST GET请求,例如: https://s3.amazonaws.com/my-bucket-name/my-private-file.dat
: https://s3.amazonaws.com/my-bucket-name/my-private-file.dat
必须将AWS签名作为授权标头包含在内才能起作用。 (假设用户具有权限)
可能的选择:
https://s3.amazonaws.com
吗? 我不确定将其视为API网关实例而不是...有什么副作用。 我无法将API端点置于S3访问的前面; 由于ACL对每个对象都有单独的ACL,因此基于直接S3访问将更易于检查ACL。
“存储”模块似乎不合适。 这似乎仅适用于预定的存储桶。 我的访问模式可以转到运行时之前未知的任何数量的存储桶。
我能够使用存储模块,但这是一个hack。
const storage = this.amplifyService.storage();
const storageOptions = {
bucket: 'any-bucket',
// see https://github.com/aws/aws-amplify/blob/master/packages/aws-amplify/src/Storage/Storage.ts#L325
// public appears to be the only option that doesn't append hardcoded values
customPrefix: {
public: ''
},
level: 'public'
};
storage.get( 'objectIdWithinBucket', storageOptions ).then(
data => {
console.log( "A signed URL is returned that can be used to access the object");
console.log( data );
},
error => {
console.log( "Boo. Err. ", error );
}
)
为何起作用:自定义前缀和公共级别会覆盖默认的s3参数。 该资源实际上不是公开的,但是任何其他选项都会附加斜杠和不属于其他字符。
(在我看来)存储模块是API设计不良的一个示例:它们提供的值基于未记录的预期用例。 我找不到任何地方可以覆盖它们的功能。 示例:如果您未指定“级别”,则它将“ public”作为对象ID的前缀。
更重要的是,存储模块假定已登录的用户使用已知的命名约定将对象存储在单个存储桶中。 改变这些很难。
警告:覆盖可能会将传递的参数分配给默认的_options。 这将在https://github.com/aws/aws-amplify/blob/240e50b61f50eaf3712bfbc088d1b096360b401c/packages/aws-amplify/src/Storage/Storage.ts#L86中发生(在撰写本文时,最近提交的快照)
也有可能使用<amplify-s3-image>
组件。
<amplify-s3-image [path]="mainImage?.key" [options]="{customPrefix: {public: ''}}">
</amplify-s3-image>
mainImage-Object通过amplify graphql上传,看起来像这样:
"mainImage": {
"bucket": "bucketname",
"region": "eu-central-1",
"key": "public/b369e63d-1a40-4793-ae49-cecde042b1b9.jpg",
"__typename": "S3Object"
},
我找不到任何文档,因此这是github上代码的链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.