URL, созданный функцией AWS Presign, не работает - PullRequest
0 голосов
/ 03 октября 2019

Всякий раз, когда я пытаюсь сгенерировать URL-адрес Presign с помощью AWS API, я получаю что-то вроде этого:

https://{OBJECT_PATH}?X-Amz-Algorithm=AWS4-HMAC-SHA256\\u0026X-Amz-Credential=AKIAJMALZY6GKVGFVOCQ%2F20191003%2Fus-east-1%2Fs3%2Faws4_request\\u0026X-Amz-Date=20191003T111419Z\\u0026X-Amz-Expires=300\\u0026X-Amz-SignedHeaders=host\\u0026X-Amz-Signature=c72a66c249fe2dada4c3925388efc62cbc734c84e01ffbf4748a5f6be9a99026\

Когда я пытаюсь ввести его, я получаю следующее сообщение:

<Error>
   <Code>AuthorizationQueryParametersError</Code>
   <Message>X-Amz-Algorithm only supports "AWS4-HMAC-SHA256"</Message
   <RequestId>7236615A79C34A4B</RequestId>
   <HostId>PHoX1otuX6apJrXRTOMM/8GvgiajrNPdElrnfSzAZCzpLzMG8NFu9RIJEiyEYHWAls91n882QNE=</HostId>
</Error>

Я пытался заменить \\u0026 на &, потому что я видел в документации (https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html), что именно так должен быть структурирован URL-адрес, я получаю:

<Error>
     <Code>SignatureDoesNotMatch</Code>
     <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
     <AWSAccessKeyId>AKIAJMALZY6GKVGFVOCQ</AWSAccessKeyId>
     <StringToSign>AWS4-HMAC-SHA256
20191003T112220Z
20191003/us-east-1/s3/aws4_request
a1d8f89ff0472249afb8f1320314eef950bcef423f05fe98420f53cc7f7d8e8f</StringToSign>
     <SignatureProvided>a1b2b7080c67e6456cbd2ab678565e5f3857483378e69ca03e35cc83232b2844\</SignatureProvided>
      <StringToSignBytes>{SEQUENCE_OF_BYTES}</StringToSignBytes>
      <CanonicalRequest>GET/{OBJECT_KEY}?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJMALZY6GKVGFVOCQ%2F20191003%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191003T112220Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host host:{BUCKET_NAME} host UNSIGNED-PAYLOAD</CanonicalRequest>
      <CanonicalRequestBytes>{SEQUENCE_OF_BYTES}</CanonicalRequestBytes>
      <RequestId>F3A0303ADD62D8FD</RequestId
      <HostId>yU7FdXLoEO+j+KpZtQH1YjF6l3RnVugBi6rzCRJOgVYk7FEQqreobMuFdSiYtzIKUgl0Qr2GcAQ=</HostId>
</Error>

Наконец, воткод, который я использую для генерации этих URL:

var accessableURLs []string
    for _, fileName := range fileNames {
        objectKey := filepath.Join(fileDir, fileName)

        req, _ := s3Obj.Client.GetObjectRequest(&s3.GetObjectInput{
            Bucket: aws.String(s3Obj.Bucket),
            Key:    aws.String(objectKey),
        })

        urlStr, err := req.Presign(expireAfter)
        if err != nil {
            glog.Errorf("Failed during generating pre-signed S3 url, reason -%v ", err)
            return nil, err
        }

        accessableURLs = append(accessableURLs, urlStr)
    }

1 Ответ

0 голосов
/ 03 октября 2019

Следующее работает с v1 aws sdk. Я не уверен, почему ваше решение дает сбой:

package main

import (
    "fmt"
    "time"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func main() {
    MyBucketName := "myAwesomeBucket"
    MyKeyName := "/path/filename.txt"
    days := 5

    session, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-1")},
    )
    s := s3.New(session)
    r, _ := s.GetObjectRequest(&s3.GetObjectInput{
        Bucket: aws.String(MyBucketName),
        Key:    aws.String(MyKeyName),
    })
    url, err := r.Presign(time.Duration(days) * 24 * time.Hour)

    if err != nil {
        fmt.Println("failure")
    }

    fmt.Println(url)
}

Следует отметить, что кредиты IAM, используемые для подписи URL-адреса, должны быть действительны до тех пор, пока подписанный URL-адрес предназначен для действия. В результате возникает проблема с компьютерами ec2, которые используют временные кредиты. Обходной путь - приложение имеет постоянный кредит IAM, который используется для подписи URL-адреса.

...