登录
首页 >  Golang >  Go问答

S3 预签名上传链接在过期前失效

来源:stackoverflow

时间:2024-03-06 18:42:26 393浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《S3 预签名上传链接在过期前失效》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有一个 lambda 来生成预签名的上传 url。这是我用来获取 url 的代码:

urlexpiresat := time.duration(10) * time.second
    s3session := s3.new(awssession)
    request, _ := s3session.putobjectrequest(&s3.putobjectinput{
        bucket:      aws.string(awssettings.filestoragebucketname),
        key:         aws.string(fmt.sprintf("%s/%s", *cognitouser.username, filename)),
        contenttype: aws.string(uploadcontenttype),
    })

    uploadurl, err := request.presign(urlexpiresat)

在我的前端,我检索该 url 并立即尝试向其发送上传 post 请求:

try {
      const {
        data: { fileuploadurl },
      } = await graphqlclient.query({
        query: gql(getfileuploadurlquery),
        variables: {
          filename,
        },
      });

      const formdata = new formdata();
      formdata.append("file", file);
      const ajaxrequest = new xmlhttprequest();
      ajaxrequest.upload.addeventlistener("progress", progresshandler, false);
      ajaxrequest.addeventlistener("load", completehandler, false);
      ajaxrequest.addeventlistener("error", errorhandler, false);
      ajaxrequest.addeventlistener("abort", aborthandler, false);
      ajaxrequest.open("post", fileuploadurl);
      ajaxrequest.send(formdata);
    } catch (err) {
      console.log(err);
    }

出于测试目的,我将我的存储桶配置为可公开访问:

{
    "version": "2012-10-17",
    "statement": [
        {
            "sid": "uploadfiles",
            "effect": "allow",
            "principal": "*",
            "action": "s3:putobject",
            "resource": "/*"
        }
    ]
}

用于测试目的的 cors 配置如下:

[
    {
        "allowedheaders": [
            "*"
        ],
        "allowedmethods": [
            "post"
        ],
        "allowedorigins": [
            "http://localhost:8080"
        ],
        "exposeheaders": []
    }
]

cors 飞行前请求返回状态 200,但是发送文件内容的 post 请求被拒绝,状态为 403 并出现以下错误:


  AccessDenied
  Request has expired
  5
  2022-09-07T04:14:50Z
  2022-09-13T06:40:18Z
...

阅读此错误后,url 似乎在预签名之前就已过期,这是没有意义的。

我在这里做错了什么?


正确答案


我发现我的解决方案有两个问题:

首先,生成预签名 url 以使用 put 方法,而不是 post

第二,awsappsyncclient 默认情况下用作 graphql 客户端缓存查询结果,因此我需要的只是使用 fetchpolicy: "network-only" 禁用缓存

const {
        data: { fileUploadUrl },
      } = await graphQlClient.query({
        query: gql(getFileUploadUrlQuery),
        fetchPolicy: "network-only",       // <- THIS LINE
        variables: {
          filename,
        },
      });

理论要掌握,实操不能落!以上关于《S3 预签名上传链接在过期前失效》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>