事前署名済み POST アップロードにより、権限のないユーザーが安全にアップロードできるようになりますファイルを S3 バケットにコピーします。事前署名された PUT とは異なり、この方法はポリシーベースの認証に依存し、ファイル転送を簡素化します。
1. S3 バケットのパブリック読み取りアクセスを構成します:
次のバケット ポリシーを設定して、パブリック読み取りアクセスを有効にします:
{ "Version": "2012-10-17", "Id": "akjsdhakshfjlashdf", "Statement": [ { "Sid": "kjahsdkajhsdkjasda", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKETNAMEHERE/*" } ] }
2. POST ポリシーの生成:
POST ポリシー テンプレートを作成し、キー フィールド (有効期限、バケット、キー、認証情報、日付) を入力して、エンコードします:
{ "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" } ] }
3.ポリシーに署名します:
S3 バケット所有者の認証情報を使用して署名を生成します:
4.マルチパート フォーム データの構築:
マルチパート フォーム データにすべてのポリシーパラメータを含めます:
func Upload(url string, fields Fields) error { var b bytes.Buffer w := multipart.NewWriter(&b) for _, f := range fields { fw, err := w.CreateFormField(f.Key) if err != nil { return err } if _, err := fw.Write([]byte(f.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()) client := &http.Client{} res, err := client.Do(req) if err != nil { return err } if res.StatusCode != http.StatusOK { err = fmt.Errorf("bad status: %s", res.Status) } return nil }
以上がGo で AWS S3 への事前署名された POST アップロードを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。