amazon-web-services - 如何使用amazonka presignURL

标签 amazon-web-services haskell amazon-s3

我正在努力掌握 amazonka图书馆。我想为 S3 预签名 PUT 请求。看着 example here ,我把下面的代码放在一起。尝试从客户端发送 JPEG 图像时它不起作用。 AWS 提示签名不正确。

我的客户端代码使用 nodejs aws sdk,所以我只能猜测我在这里配置不正确。

<Error>
  <Code>
    SignatureDoesNotMatch
  </Code>
  <Message>
    The request signature we calculated does not match the signature you provided. Check your key and signing method.
  </Message>
  <CanonicalRequest>
    PUT
    /my-bucket/test.jpg
    X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-
    Credential=[MY_AWS_ACCESS_KEY]%2F20171010%2Feu-west-
    1%2Fs3%2Faws4_request&X-Amz-Date=20171010T084724Z&X-Amz-
    Expires=100000&X-Amz-SignedHeaders=expect%3Bhost
    expect:
    host:s3-eu-west-1.amazonaws.com

    expect;host
    UNSIGNED-PAYLOAD
 </CanonicalRequest>
...

这是我的代码:

getS3UrlR :: Handler Value
getS3UrlR = do
  y <- getYesod
  let settings = appSettings y

  env <- newEnv $ FromKeys (AccessKey $ encodeUtf8 $ appAwsAccessKey settings) (SecretKey $ encodeUtf8 $ appAwsSecretKey settings)
  ts  <- liftIO $ getCurrentTime

  let b = BucketName $ appS3Bucket settings
      k = ObjectKey "profile-pic-test"
  url <- liftIO $ runResourceT . runAWST env . within Ireland $ presignURL ts 100000 (putObject b k (toBody ("" :: ByteString)))
  return $ toJSON $ decodeUtf8 url

我该如何调试它?

注意 - putObject 需要一个 RqBody 参数,但我没有提供(因为客户端将提供请求主体)。所以我只提供了一个空字符串。这会是个问题吗?

编辑 - 我尝试签署 GET 请求以查看是否可行。它工作正常!但是 PUT 没有。这是可以正常工作的更改行:

url <- liftIO $ runResourceT . runAWST env . within Ireland $ presignURL ts 100000 (getObject b k)

最佳答案

我发现了 2 月的一个问题,这让我找到了解决方法。似乎 presignURL 正在向签名 URL 添加一个无关的 header 。当我重写请求以在签名之前删除 Expect header 时,生成的 URL 使用简单的 PUT。

我的解决方法包含在 my comment on the github issue 中.

关于amazon-web-services - 如何使用amazonka presignURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46604523/

相关文章:

haskell - 是否可以在 Haskell 中嵌套守卫?

Haskell ghci 变量不在范围内

azure - 为什么 ADF 不会列出我的 S3 存储桶的内容?

php - 是否可以通过标准机制(即文件系统路径)公开 S3 存储?

javascript - 从客户端浏览器直接上传 Amazon S3 文件 - 私钥泄露

amazon-web-services - AWS 代码部署 : stuck on install step

csv - 使用COPY命令的Redshift错误1202 “Extra column(s) found”

amazon-web-services - CloudFormation 中应用程序负载均衡器的 AWS::WAFv2::WebACLAssociation ResourceArn

amazon-web-services - 如何接收通过 Amazon Route53 注册的域的电子邮件

regex - 如何在 Haskell 的 Text.Regex 库中转义字符?