如何使用amazonka presignURL

时间:2017-10-06 11:16:36

标签: 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)

0 个答案:

没有答案