[strapi]S3 插件 - 私有 ACL 与 CDN 一起使用生成签名 URL(反向逻辑)

2024-05-13 943 views
4
错误报告 所需的系统信息
  • Node.js 版本:18.15.1
  • NPM版本:9.5.0
  • 斯特拉皮版本:4.11.3
  • 数据库:Postgres 15.2
  • 操作系统:Alpine 3.18
  • 你的项目是Javascript还是Typescript:Javascript
描述错误

将 S3 插件 ACL 属性设置为private并使用 CDN 时,插件会生成签名的 S3 URL,而不是使用 CDN URL。这是不正确的。

重现行为的步骤
  1. 使用 S3 存储桶和 CDN 配置 S3 插件
  2. 将对象上传到 Strapi
  3. 利用 REST API 检索对象 URL
预期行为

预期行为是将 S3 中的对象 ACL 设置为private并返回 CDN URL 以访问该对象。

截图

不适用

代码片段

变量错误识别导致反向逻辑错误。 (https://github.com/strapi/strapi/blame/1b09113fc3d40565c8db3bb3d953e6578b09f081/packages/providers/upload-aws-s3/src/utils.ts#L8

推荐(选择一项):

  1. 在函数中isUrlFromBucket,重命名bucketBaseUrl为 bebaseUrl并反转 URL 比较作为返回
  2. 从index.ts调用时isUrlFromBucket,在第三个参数中传递bucketUrl而不是baseUrl

修复后的其他建议: 删除此警告

额外的背景信息

不适用

回答

0

@Marc-Roig,私有 url 的事情实际上是一个重大更改,如果您在 v4.9.1 上,从那时起它为您提供了 CDN url,但将您的存储桶设为私有。

因此,strapis 的输出发生了变化,而无需他更新版本

9

@Boegie19 在 4.9.1 之前,您无法将 ACL 设置为私有,当我们引入文件签名时,我们允许这样做。

7

我们升级到 4.9.1 以使用 ACL =private并使用 CDN。

9

但实现时存在一个问题,即假设私有 ACL 配置必须始终具有签名文件。

8

我明白了,我会检查一下我们能做什么。

0

@Marc-Roig 修复很简单,引入一个新密钥来设置签名或 cdn url,并且默认为 cdn url

5

同意,如果使用 CDN,我们将不会签署文件。

5

所以使用S3插件有2个因素:

  1. 在 S3 对象上设置正确的 ACL
  2. 返回预签名 URL。

这些并不相互排斥。我应该能够设置 ACL =private以满足存储桶中 S3 对象本身的安全要求。

CloudFront 将 S3 对象作为经过身份验证的身份进行访问。这允许 S3 对象是私有的,但 CloudFront URL 可用于访问 S3 中的对象。

因此,在使用 CDN 时我不需要/想要预签名 URL。

5

你是完全正确的@travisdieckmann,我们在定义时没有考虑到这一点isUrlFromBucket。我认为你的建议实际上应该在这里完成:)我现在正在创建一个 PR

7

@Marc-Roig 只是为了让你知道https://github.com/strapi/documentation/pull/1601适用于 4.9.0,因此该版本 ACL 可以设置为私有,即对 url 所做的更改是一项重大更改|

第二个注意事项是我们应该通过新功能添加版本号。或已验证文档

1

如果您想测试它,这里是实验版本:0.0.0-experimental.133ddc2de4e58dc1eb476fda8e0a67b0f1ee6e74

我们可能会在下周的 4.11.4 版本中发布它?

8

极好的! :rocket:我将尝试实验并在这里提供反馈。

0

再次感谢您的反馈并提供对问题的如此详细的描述,很高兴能够解决这样的问题?

3

这已经解决了问题!感谢您的快速周转! :拍: