amazon-web-services - 通过 S3 SignedUrl 保护 Strapi 上传文件夹

标签 amazon-web-services amazon-s3 strapi

从 strapi 上传文件到 s3 工作正常。 我正在尝试使用签名 url 来保护文件:

var params = {Bucket:process.env.AWS_BUCKET, Key: `${path}${file.hash}${file.ext}`, Expires: 3000};
      var secretUrl = ''
      S3.getSignedUrl('getObject', params, function (err, url) {
        console.log('Signed URL: ' + url);
        secretUrl = url
      });

      
      S3.upload(
        {
          Key: `${path}${file.hash}${file.ext}`,
          Body: Buffer.from(file.buffer, 'binary'),
          //ACL: 'public-read',
          ContentType: file.mime,
          ...customParams,
        },
        (err, data) => {
          if (err) {
            return reject(err);
          }

          // set the bucket file url
          //file.url = data.Location;
          file.url = secretUrl;
          console.log('FIle URL: ' + file.url);

          resolve();
        }
      );

file.url (secretUrl) 包含正确的 URL,我可以在浏览器中使用它来检索文件。 但是每当从 strapi 管理面板读取文件时,都不会显示文件或缩略图。 我发现 strapi 向文件添加了一个参数,例如 ?2304.4005,它破坏了文件到 AWS 的获取。我在哪里以及如何改变这种行为

感谢帮助

最佳答案

这是我创建签名 URL 以保护您的 Assets 的解决方案。该 URL 将在一定时间内有效。

  1. 创建一个包含您要保护的媒体字段的集合类型。在我的示例中,集合类型称为 invoice,媒体字段称为 document

  2. Create an S3 bucket

  3. 安装和配置 strapi-provider-upload-aws-s3AWS SDK for JavaScript

  4. Customize the Strapi controller对于你的发票端点(在这个例子中我使用核心 Controller findOne)

const { sanitizeEntity } = require('strapi-utils');
var S3 = require('aws-sdk/clients/s3');

module.exports = {

  async findOne(ctx) {
    const { id } = ctx.params;

    const entity = await strapi.services.invoice.findOne({ id });
    // key is hashed name + file extension of your entity
    const key = entity.document.hash + entity.document.ext;

    // create signed url
    const s3 = new S3({
        endpoint: 's3.eu-central-1.amazonaws.com',   // s3.region.amazonaws.com
        accessKeyId: '...',       // your accessKeyId
        secretAccessKey: '...',   // your secretAccessKey
        Bucket: '...',         // your bucket name
        signatureVersion: 'v4',
        region: 'eu-central-1'           // your region
    });

    var params = {
        Bucket:'',   // your bucket name
        Key: key, 
        Expires: 20 // expires in 20 seconds
    };

    var url = s3.getSignedUrl('getObject', params);

    entity.document.url = url  // overwrite the url with signed url

    return sanitizeEntity(entity, { model: strapi.models.invoice });
  },

};

关于amazon-web-services - 通过 S3 SignedUrl 保护 Strapi 上传文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65664843/

相关文章:

amazon-web-services - AWS 提供对另一个帐户的代入角色的访问权限,以访问我的帐户中的 S3

graphql - 使用 slug 作为 Graphql 和 Strapi V4 的过滤器

joi - 如何将 joi 验证器与 Strapi.js 一起使用?

amazon-web-services - 创建k8s资源并等待完成继续下一步

go - 在Go中将文件从本地文件夹移动到s3存储桶

android - 来自 Android 的所有 S3 调用都出现 504 错误

Strapi.io-如何从 Controller 中的 beforeupdate/beforesave 函数向 contentmanager ui 抛出警报消息

amazon-web-services - 如何设置用户登录、身份验证和授权 AWS Cognito

node.js - aws-sdk NodeJS 从环境变量中读取凭证

javascript - 运行 AWS Lambda 函数一段时间