Heim  >  Artikel  >  Backend-Entwicklung  >  Wie implementiert man vorsignierte POST-Datei-Uploads in AWS S3 mit Go?

Wie implementiert man vorsignierte POST-Datei-Uploads in AWS S3 mit Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-21 22:30:13960Durchsuche

How to Implement Pre-Signed POST File Uploads to AWS S3 Using Go?

Vorsignierter POST-Upload auf AWS S3 mit Go

Für den sicheren Datei-Upload in AWS S3-Buckets bietet vorsignierter POST eine praktische Möglichkeit Ansatz. So erreichen Sie dies in Go:

1. Bucket-Zugriff konfigurieren:

Ändern Sie die Richtlinie Ihres S3-Buckets, um öffentliche Downloads zu ermöglichen:

{
    "Version": "2012-10-17",
    "Id": "akjsdhakshfjlashdf",
    "Statement": [
        {
            "Sid": "kjahsdkajhsdkjasda",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKETNAMEHERE/*"
        }
    ]
}

2. Erstellen Sie eine vorsignierte POST-Richtlinie:

Erstellen Sie eine HTTP-POST-Richtlinie, die Upload-Berechtigungen gewährt:

{ "expiration": "%s",
    "conditions": [
        {"bucket": "%s"},
        ["starts-with", "$key", "%s"],
        {"acl": "public-read"},

        {"x-amz-credential": "%s"},
        {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
        {"x-amz-date": "%s" }
    ]
}

Konfigurieren Sie die Richtlinie mit diesen Parametern:

  • Ablaufzeit: Ablaufzeit des Uploads
  • Bucket: Ziel-S3-Bucket Name
  • Schlüssel: Name der hochzuladenden Datei
  • Anmeldeinformationen: Ihre AWS-Anmeldeinformationen
  • Datum: Aktuelles Datum

3 . Richtlinie signieren:

Verwenden Sie die Anmeldeinformationen des S3-Bucket-Besitzers, um die Richtlinie zu signieren:

  • Kodieren Sie die Richtlinie mit base64
  • Berechnen Sie die HMAC-SHA256-Signatur
  • Kodieren Sie die Signatur als Hexadezimalzahl Zeichenfolge

4. POST-Anfrage erstellen:

Erstellen Sie die mehrteilige Formulardatenanforderung:

import "github.com/aws/aws-sdk-go/aws/credentials"

type Field struct {
    Key, Value string
}

func Upload(url string, fields []Field) error {
    b := new(bytes.Buffer)
    w := multipart.NewWriter(b)
    for _, field := range fields {
        fw, err := w.CreateFormField(field.Key)
        if err != nil {
            return err
        }
        if _, err := fw.Write([]byte(field.Value)); err != nil {
            return err
        }
    }
    w.Close()

    req, err := http.NewRequest("POST", url, b)
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", w.FormDataContentType())

    creds := &credentials.StaticProvider{Value: credentials.Value{
        AccessKeyID:     "AKIAIOSFODNN7EXAMPLE",
        SecretAccessKey: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    }}
    cfg := &aws.Config{Credentials: creds}

    client := new(&http.Client{Transport: &aws.HTTPSHandler{Client: *client, Config: *cfg}})
    res, err := client.Do(req)
    if err != nil {
        return err
    }
    if res.StatusCode != http.StatusOK {
        return fmt.Errorf("bad status: %s", res.Status)
    }
    return nil
}

Geben Sie die signierten Richtlinienfelder und die Endpunkt-URL an. Ihr vorsignierter POST-Upload auf AWS S3 wird dann ausgeführt.

Das obige ist der detaillierte Inhalt vonWie implementiert man vorsignierte POST-Datei-Uploads in AWS S3 mit Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn