2

我已经配置了放大角度并用于身份验证和 API 访问。使用角 5。

我可以访问私有 S3 资源并利用在 API 访问期间使用的相同身份验证吗?

具体来说,我想向 S3 对象发出 REST GET 请求,例如: https://s3.amazonaws.com/my-bucket-name/my-private-file.dat

AWS 签名需要作为授权标头包含在内才能正常工作。(假设用户有权限)

可能的选项:

  • RestClient 类:它似乎做我想做的事,但我不认为它已导出或可供我的应用程序代码使用
  • API:我可以在我的放大配置中定义另一个 APIhttps://s3.amazonaws.com吗?我不确定将其视为 API 网关实例而不是......无论它是什么,都会产生什么副作用。

我不能将 API 端点放在 S3 访问之前;基于直接 S3 访问,ACL 会更容易检查,因为它们对每个对象都有单独的 ACL。

“存储”模块似乎不合适。这似乎只适用于预先确定的桶。我的访问模式可以访问到运行时才知道的任意数量的存储桶。

4

2 回答 2

4

我能够使用存储模块,但它是一个黑客。

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 参数。该资源实际上并不公开,但任何其他选项都会附加斜杠和不属于的额外字符。

Storage 模块(在我看来)是一个糟糕的 API 设计示例:它们提供的值基于未记录的预期用例。在我能找到的任何地方都没有记录覆盖它们的能力。示例:如果您没有指定“级别”,它会将“公共”作为前缀附加到对象 ID。

更重要的是,存储模块假设登录用户将对象存储在具有已知命名约定的单个存储桶中。改变这些是困难的。

警告:覆盖可能会将传递的参数分配给默认的_options。这将发生在https://github.com/aws/aws-amplify/blob/240e50b61f50eaf3712bfbc088d1b096360b401c/packages/aws-amplify/src/Storage/Storage.ts#L86(在撰写本文时最近提交的快照)

于 2018-07-10T20:16:37.527 回答
0

还有可能使用<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 上代码的链接。

于 2019-03-23T17:57:37.660 回答