Menandatangani dan mengautentikasi permintaan REST - Amazon Simple Storage Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menandatangani dan mengautentikasi permintaan REST

catatan

Topik ini menjelaskan tentang autentikasi permintaan dengan menggunakan Tanda Tangan Versi 2. Amazon S3 kini mendukung Tanda Tangan Versi 4 terbaru. Versi tanda tangan terbaru ini didukung di semua wilayah dan setiap wilayah baru setelah 30 Januari 2014 hanya akan mendukung Tanda Tangan Versi 4. Untuk informasi selengkapnya, buka Authenticating Requests (AWS Signature Version 4) di Amazon Simple Storage Service API Reference.

Autentikasi adalah proses pembuktian identitas Anda pada sistem. Identitas adalah faktor penting dalam keputusan kontrol akses Amazon S3. Permintaan diizinkan atau ditolak sebagian berdasarkan identitas pemohon. Sebagai contoh, hak untuk membuat bucket disediakan untuk pengembang yang terdaftar dan (secara default) hak untuk membuat objek di dalam bucket disediakan untuk pemilik bucket yang bersangkutan. Sebagai pengembang, Anda akan membuat permintaan yang menginvokasi hak istimewa ini, jadi Anda perlu membuktikan identitas pada sistem dengan melakukan autentikasi atas permintaan Anda. Dalam bagian ini, akan ditunjukkan caranya.

catatan

Konten di bagian ini tidak berlaku untuk HTTPPOST. Untuk informasi selengkapnya, lihat Unggahan berbasis browser menggunakan POST (versi AWS tanda tangan 2).

Amazon S3 REST API menggunakan HTTP skema kustom berdasarkan keyed- HMAC (Kode Otentikasi Pesan Hash) untuk otentikasi. Untuk mengautentikasi permintaan, pertama-tama Anda perlu menggabungkan elemen-elemen yang dipilih dari permintaan tersebut untuk membentuk string. Anda kemudian menggunakan kunci akses AWS rahasia Anda untuk menghitung HMAC string itu. Secara informal, kami menyebut proses ini “menandatangani permintaan,” dan kami menyebut output dari HMAC algoritma tanda tangan, karena mensimulasikan properti keamanan dari tanda tangan nyata. Terakhir, Anda perlu menambahkan tanda tangan ini sebagai parameter permintaan dengan menggunakan sintaks yang dijelaskan dalam bagian ini.

Ketika sistem menerima permintaan yang diautentikasi, ia mengambil kunci akses AWS rahasia yang Anda klaim memiliki dan menggunakannya dengan cara yang sama untuk menghitung tanda tangan untuk pesan yang diterimanya. Kemudian, sistem akan membandingkan tanda tangan yang dihitung dengan tanda tangan yang diberikan oleh pemohon. Jika kedua tanda tangan cocok, sistem menyimpulkan bahwa pemohon harus memiliki akses ke kunci akses AWS rahasia dan oleh karena itu bertindak dengan otoritas kepala sekolah kepada siapa kunci itu dikeluarkan. Jika kedua tanda tangan tidak cocok, permintaan akan dibatalkan dan sistem merespons dengan mengirimkan pesan kesalahan.

contoh Permintaan Amazon REST S3 yang diautentikasi
GET /photos/puppy.jpg HTTP/1.1 Host: awsexamplebucket1.us-west-1.s3.amazonaws.com Date: Tue, 27 Mar 2007 19:36:42 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE: qgk2+6Sv9/oM7G3qLEjTH1a1l1g=

Menggunakan kredensial keamanan sementara

Jika Anda menandatangani permintaan menggunakan kredensial keamanan sementara (lihat Membuat permintaan), Anda harus menyertakan token keamanan yang sesuai dalam permintaan dengan menambahkan header x-amz-security-token.

Saat Anda memperoleh kredensil keamanan sementara menggunakan AWS Security Token Service API, respons tersebut mencakup kredensil keamanan sementara dan token sesi. Anda memberikan nilai token sesi dalam header x-amz-security-token saat Anda mengirim permintaan ke Amazon S3. Untuk informasi tentang yang AWS Security Token Service API disediakan olehIAM, buka Tindakan dalam Panduan AWS Security Token Service API Referensi.

Header autentikasi

Amazon S3 REST API menggunakan HTTP Authorization header standar untuk meneruskan informasi otentikasi. (Nama header standar tidak disarankan karena memuat informasi autentikasi, bukan otorisasi.) Berdasarkan skema autentikasi Amazon S3, header Otorisasi memiliki bentuk berikut ini:

Authorization: AWS AWSAccessKeyId:Signature

Pengembang diberikan ID kunci AWS akses dan kunci akses AWS rahasia saat mereka mendaftar. Untuk autentikasi permintaan, elemen AWSAccessKeyId mengidentifikasi ID kunci akses yang digunakan untuk menghitung tanda tangan dan secara tidak langsung, juga mengidentifikasi pengembang yang mengajukan permintaan.

SignatureElemennya adalah RFC 2104 HMAC - SHA1 elemen yang dipilih dari permintaan, sehingga Signature bagian dari header Otorisasi akan bervariasi dari permintaan ke permintaan. Jika tanda tangan permintaan yang dihitung oleh sistem cocok dengan yang Signature disertakan dengan permintaan, pemohon akan menunjukkan kepemilikan kunci akses AWS rahasia. Permintaan tersebut kemudian akan diproses menggunakan identitas tersebut dan dengan otoritas dari pengembang yang diberikan kunci tersebut.

Berikut ini adalah pseudogrammar yang mengilustrasikan konstruksi header permintaan Authorization. (Dalam contoh tersebut, \n berarti titik kode Unicode U+000A, umumnya disebut sebagai baris baru).

Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) ); StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ subresource, if present. For example "?acl", "?location", or "?logging"]; CanonicalizedAmzHeaders = <described below>

HMAC- SHA1 adalah algoritma yang didefinisikan oleh RFC2104 - Keyed-Hashing untuk Otentikasi Pesan. Algoritma tersebut menerima dua string byte sebagai input, yaitu kunci dan pesan. Untuk autentikasi permintaan Amazon S3, gunakan kunci akses AWS rahasia (YourSecretAccessKey) sebagai kunci, dan pengkodean UTF -8 sebagai pesan. StringToSign Output dari HMAC - SHA1 juga string byte, yang disebut intisari. Parameter permintaan Signature dibangun berdasarkan Base64 yang mengkodekan digest ini.

Kanonikalisasi permintaan untuk penandatanganan

Ingatlah bahwa ketika sistem menerima permintaan yang diautentikasi, sistem tersebut membandingkan tanda tangan permintaan yang dikomputasi dengan tanda tangan yang disertakan dalam permintaan di StringToSign. Oleh karena itu, Anda harus melakukan komputasi tanda tangan dengan menggunakan metode yang sama seperti yang digunakan oleh Amazon S3. Kami menyebut proses permohonan dalam bentuk yang telah disetujui untuk penandatanganan sebagai kanonikalisasi.

Membuat CanonicalizedResource elemen

CanonicalizedResource mewakili sumber daya Amazon S3 yang ditarget oleh permintaan. Bangun untuk REST permintaan sebagai berikut:

1

Mulai dengan string kosong ("").

2

Jika permintaan menentukan bucket menggunakan header Host (gaya HTTP host virtual), tambahkan nama bucket yang didahului dengan (misalnya, “/bucketname”"/"). Untuk permintaan yang menggunakan gaya penulisan path dan permintaan yang tidak ditujukan ke bucket, jangan lakukan apa pun. Untuk informasi selengkapnya tentang permintaan cara hosting virtual, lihat Bucket dengan hosting virtual.

Untuk permintaan gaya host virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg “, CanonicalizedResource adalah “/awsexamplebucket1".

Untuk permintaan gaya jalur, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg “, CanonicalizedResource adalah “”.

3

Tambahkan bagian jalur dari HTTP Request- yang tidak diterjemahkanURI, up-to tetapi tidak termasuk string kueri.

Untuk permintaan gaya host virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg “, itu CanonicalizedResource adalah" /awsexamplebucket1/photos/puppy.jpg”.

Untuk permintaan gaya jalur, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg “, CanonicalizedResource adalah" /awsexamplebucket1/photos/puppy.jpg”. Pada titik ini, CanonicalizedResource sama, baik untuk permintaan gaya penulisan hosting virtual dan permintaan gaya penulisan path.

Untuk permintaan yang tidak membahas bucket, seperti GETService, tambahkan “/”.

4

Jika permintaan membahas sub-sumber daya, seperti ?versioning, ?location, ?acl, ?lifecycle, atau ?versionid tambahkan sub-sumber dayanya, nilainya, jika ada, dan tanda tanya. Perhatikan bahwa dalam kasus beberapa subsumber daya, subsumber daya harus diurutkan secara leksikografis berdasarkan nama subsumber daya dan dipisahkan oleh '&', misalnya,? acl& = versionIdvalue.

Subresource yang harus disertakan saat membuat CanonicalizedResource Elemen adalah acl, lifecycle, location, logging, notification, policy,,, uploadpartNumber, versioning requestPaymentuploadId, versionversionId, dan website.

Jika permintaan menentukan parameter string kueri yang menimpa nilai header respons (lihat Dapatkan Objek), tambahkan parameter string kueri dan nilainya. Saat menandatangani, Anda tidak melakukan encoding atas nilai-nilai ini; namun, saat membuat permintaan, Anda harus melakukan encoding atas nilai-nilai parameter ini. Parameter string kueri dalam GET permintaan meliputiresponse-content-type,response-content-language,response-expires,response-cache-control,response-content-disposition, danresponse-content-encoding.

Parameter string delete kueri harus disertakan saat Anda membuat permintaan Delete CanonicalizedResource untuk multi-objek.

Elemen CanonicalizedResource yang berasal dari HTTP Permintaan- URI harus ditandatangani secara harfiah seperti yang muncul dalam HTTP permintaan, termasuk karakter meta URL -Encoding.

CanonicalizedResourceMungkin berbeda dari HTTP Permintaan-URI. Khususnya, jika permintaan Anda menggunakan HTTP Host header untuk menentukan bucket, bucket tidak akan muncul di HTTP Request-URI. Namun, CanonicalizedResource harus tetap menyertakan bucket. Parameter string kueri mungkin juga muncul di Permintaan- URI tetapi tidak disertakan dalamCanonicalizedResource. Untuk informasi selengkapnya, lihat Bucket dengan hosting virtual.

Membuat CanonicalizedAmzHeaders elemen

Untuk membuat CanonicalizedAmzHeaders bagian dariStringToSign, pilih semua header HTTP permintaan yang dimulai dengan 'x-amz-' (menggunakan perbandingan case-insensitive), dan gunakan proses berikut.

1 Ubah setiap nama HTTP header menjadi huruf kecil. Misalnya, 'X-Amz-Date' menjadi 'x-amz-date'.
2 Urutkan pengumpulan header secara leksikografis berdasarkan nama header.
3 Gabungkan bidang header dengan nama yang sama menjadi satu pasangan “header-name:comma-separated-value-list” seperti yang ditentukan oleh RFC 2616, bagian 4.2, tanpa spasi di antara nilai. Misalnya, dua metadata header 'x-amz-meta-username: fred' dan 'x-amz-meta-username: barney' akan digabungkan ke dalam header tunggal 'x-amz-meta-username: fred,barney'.
4 “Buka” header panjang yang menjangkau beberapa baris (seperti yang diizinkan oleh RFC 2616, bagian 4.2) dengan mengganti ruang lipat (termasuk baris baru) dengan satu spasi.
5 Hapus setiap spasi di sekitar titik dua yang terdapat dalam header. Contohnya, header 'x-amz-meta-username: fred,barney' akan menjadi 'x-amz-meta-username:fred,barney'
6 Terakhir, tambahkan karakter baris baru (U+000A) untuk setiap header kanonikalisasi dalam daftar hasil. Membangun CanonicalizedResource elemen dengan menggabungkan semua header dalam daftar ini menjadi string tunggal.

Posisi versus elemen HTTP header StringToSign bernama

Beberapa elemen header pertama StringToSign (Content-Type, Date, dan Content-MD5) bersifat posisional. StringToSigntidak termasuk nama-nama header ini, hanya nilainya dari permintaan. Sebaliknya, elemen 'x-amz-' diberi nama. Baik nama header dan nilai header akan muncul di StringToSign.

Jika header posisi yang dipanggil dalam definisi tidak StringToSign ada dalam permintaan Anda (misalnya, Content-Type atau Content-MD5 opsional untuk PUT permintaan dan tidak berarti untuk GET permintaan), gantikan string kosong (“”) untuk posisi itu.

Ketentuan stempel waktu

Stempel waktu yang valid (menggunakan HTTP Date header atau x-amz-date alternatif) wajib untuk permintaan yang diautentikasi. Selain itu, stempel waktu klien yang disertakan dengan permintaan yang diautentikasi harus dalam waktu 15 menit dari waktu sistem Amazon S3 saat permintaan tersebut diterima. Jika tidak, permintaan akan gagal dengan kode kesalahan RequestTimeTooSkewed. Tujuan dari pembatasan ini adalah untuk membatasi kemungkinan bahwa permintaan yang diintersepsi dapat diputar ulang oleh pihak lawan. Untuk perlindungan yang lebih kuat terhadap penyadapan, gunakan HTTPS transport untuk permintaan yang diautentikasi.

catatan

Batasan validasi pada tanggal permintaan hanya berlaku untuk permintaan yang diautentikasi yang tidak menggunakan autentikasi string kueri. Untuk informasi selengkapnya, lihat Alternatif autentikasi permintaan string kueri.

Beberapa pustaka HTTP klien tidak mengekspos kemampuan untuk mengatur Date header untuk permintaan. Jika Anda mengalami masalah saat menyertakan nilai header 'Tanggal' di header kanonikalisasi, Anda dapat mengatur stempel waktu untuk permintaan tersebut dengan menggunakan header 'x-amz-date'. Nilai x-amz-date header harus dalam salah satu format RFC 2616 (http://www.ietf.org/rfc/rfc2616.txt). Saat header x-amz-date terdapat dalam permintaan, maka sistem akan mengabaikan header Date saat melakukan komputasi tanda tangan permintaan. Oleh karena itu, jika Anda menyertakan header x-amz-date, gunakan string kosong untuk Date saat membangun StringToSign. Lihat contohnya di bagian berikut.

Contoh-contoh autentikasi

Contoh-contoh dalam bagian ini menggunakan kredensial (nonkerja) dalam tabel berikut.

Parameter Nilai
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Dalam contoh StringToSign, format tidak signifikan, dan \n berarti titik kode Unicode U+000A yang biasanya disebut sebagai baris baru. Selain itu, contoh tersebut menggunakan “+0000” untuk menentukan zona waktu. Anda dapat menggunakan "GMT" untuk menentukan zona waktu sebagai gantinya, tetapi tanda tangan yang ditunjukkan dalam contoh akan berbeda.

Objek GET

Contoh ini mendapatkan objek dari bucket awsexamplebucket1.

Permintaan StringToSign
GET /photos/puppy.jpg HTTP/1.1 Host: awsexamplebucket1.us-west-1.s3.amazonaws.com Date: Tue, 27 Mar 2007 19:36:42 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE: qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
GET\n \n \n Tue, 27 Mar 2007 19:36:42 +0000\n /awsexamplebucket1/photos/puppy.jpg

Perhatikan bahwa CanonicalizedResource menyertakan nama bucket, tetapi HTTP Request- URI tidak. (Bucket ditentukan berdasarkan header Host.)

catatan

Skrip Python berikut ini menghitung tanda tangan sebelumnya, menggunakan parameter yang disediakan. Anda dapat menggunakan skrip ini untuk membuat tanda tangan Anda sendiri, mengganti kunci dan StringToSign yang sesuai.

import base64 import hmac from hashlib import sha1 access_key = 'AKIAIOSFODNN7EXAMPLE'.encode("UTF-8") secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'.encode("UTF-8") string_to_sign = 'GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg'.encode("UTF-8") signature = base64.b64encode( hmac.new( secret_key, string_to_sign, sha1 ).digest() ).strip() print(f"AWS {access_key.decode()}:{signature.decode()}")

Objek PUT

Contoh ini menempatkan sebuah objek ke dalam bucket awsexamplebucket1.

Permintaan StringToSign
PUT /photos/puppy.jpg HTTP/1.1 Content-Type: image/jpeg Content-Length: 94328 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com Date: Tue, 27 Mar 2007 21:15:45 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE: iqRzw+ileNPu1fhspnRs8nOjjIA=
PUT\n \n image/jpeg\n Tue, 27 Mar 2007 21:15:45 +0000\n /awsexamplebucket1/photos/puppy.jpg

Perhatikan header Content-Type dalam permintaan dan di. StringToSign Perhatikan juga bahwa Konten- MD5 dibiarkan kosong di StringToSign, karena tidak ada dalam permintaan.

Daftar

Contoh ini mencantumkan konten dari bucket awsexamplebucket1.

Permintaan StringToSign
GET /?prefix=photos&max-keys=50&marker=puppy HTTP/1.1 User-Agent: Mozilla/5.0 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com Date: Tue, 27 Mar 2007 19:42:41 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE: m0WP8eCtspQl5Ahe6L1SozdX9YA=
GET\n \n \n Tue, 27 Mar 2007 19:42:41 +0000\n /awsexamplebucket1/

Perhatikan garis miring pada CanonicalizedResource dan tidak adanya parameter string kueri.

Mengambil

Contoh ini mengambil sub-sumber daya kebijakan kontrol akses untuk bucket 'awsexamplebucket1'.

Permintaan StringToSign
GET /?acl HTTP/1.1 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com Date: Tue, 27 Mar 2007 19:44:46 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE: 82ZHiFIjc+WbcwFKGUVEQspPn+0=
GET\n \n \n Tue, 27 Mar 2007 19:44:46 +0000\n /awsexamplebucket1/?acl

Perhatikan bagaimana parameter string kueri subresource disertakan dalam. CanonicalizedResource

Hapus

Contoh ini menghapus objek dari bucket 'awsexamplebucket1' menggunakan alternatif gaya penulisan path dan Tanggal.

Permintaan StringToSign
DELETE /awsexamplebucket1/photos/puppy.jpg HTTP/1.1 User-Agent: dotnet Host: s3.us-west-1.amazonaws.com Date: Tue, 27 Mar 2007 21:20:27 +0000 x-amz-date: Tue, 27 Mar 2007 21:20:26 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE:XbyTlbQdu9Xw5o8P4iMwPktxQd8=
DELETE\n \n \n Tue, 27 Mar 2007 21:20:26 +0000\n /awsexamplebucket1/photos/puppy.jpg

Perhatikan bagaimana kami menggunakan metode 'x-amz-date' alternatif untuk menentukan tanggal (karena pustaka klien kami mencegah kami mengatur tanggal, katakanlah). Dalam hal ini, x-amz-date lebih diutamakan dari header Date. Oleh karena itu, entri tanggal pada tanda tangan harus berisi nilai header x-amz-date.

Unggah

Contoh ini mengunggah objek ke bucket CNAME gaya virtual yang dihosting dengan metadata.

Permintaan StringToSign
PUT /db-backup.dat.gz HTTP/1.1 User-Agent: curl/7.15.5 Host: static.example.com:8080 Date: Tue, 27 Mar 2007 21:06:08 +0000 x-amz-acl: public-read content-type: application/x-download Content-MD5: 4gJE4saaMU4BqNR0kLY+lw== X-Amz-Meta-ReviewedBy: joe@example.com X-Amz-Meta-ReviewedBy: jane@example.com X-Amz-Meta-FileChecksum: 0x02661779 X-Amz-Meta-ChecksumAlgorithm: crc32 Content-Disposition: attachment; filename=database.dat Content-Encoding: gzip Content-Length: 5913339 Authorization: AWS AKIAIOSFODNN7EXAMPLE: jtBQa0Aq+DkULFI8qrpwIjGEx0E=
PUT\n 4gJE4saaMU4BqNR0kLY+lw==\n application/x-download\n Tue, 27 Mar 2007 21:06:08 +0000\n x-amz-acl:public-read\n x-amz-meta-checksumalgorithm:crc32\n x-amz-meta-filechecksum:0x02661779\n x-amz-meta-reviewedby: joe@example.com,jane@example.com\n /static.example.com/db-backup.dat.gz

Perhatikan bagaimana header 'x-amz-' diurutkan, dipotong spasi ekstranya, dan diubah menjadi huruf kecil. Perhatikan juga bahwa beberapa header yang memiliki nama yang sama telah digabungkan menggunakan koma untuk memisahkan nilai.

Perhatikan bagaimana hanya header Content-Type dan Content-MD5 HTTP entitas yang muncul di. StringToSign Header entitas Content-* lainnya tidak muncul.

Sekali lagi, perhatikan bahwa CanonicalizedResource menyertakan nama bucket, tetapi HTTP Request- URI tidak. (Bucket ditentukan berdasarkan header Host.)

Tuliskan semua bucket saya

Permintaan StringToSign
GET / HTTP/1.1 Host: s3.us-west-1.amazonaws.com Date: Wed, 28 Mar 2007 01:29:59 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE:qGdzdERIC03wnaRNKh6OqZehG9s=
GET\n \n \n Wed, 28 Mar 2007 01:29:59 +0000\n /

Kunci Unicode

Permintaan StringToSign
GET /dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re HTTP/1.1 Host: s3.us-west-1.amazonaws.com Date: Wed, 28 Mar 2007 01:49:49 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE:DNEZGsoieTZ92F3bUfSPQcbGmlM=
GET\n \n \n Wed, 28 Mar 2007 01:49:49 +0000\n /dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re
catatan

Unsur-unsur StringToSign yang berasal dari Permintaan- diambil URI secara harfiah, termasuk URL -Encoding dan kapitalisasi.

RESTmeminta masalah penandatanganan

Ketika otentikasi REST permintaan gagal, sistem merespons permintaan dengan dokumen XML kesalahan. Informasi yang terdapat dalam dokumen kesalahan ini ditujukan untuk membantu pengembang melakukan diagnosis masalah. Secara khusus, elemen StringToSign dari dokumen kesalahan SignatureDoesNotMatch memberi tahu Anda dengan tepat kanonikalisasi permintaan yang digunakan oleh sistem.

Beberapa toolkit diam-diam memasukkan header yang tidak Anda ketahui sebelumnya, seperti menambahkan header selama a. Content-Type PUT Dalam sebagian besar kasus ini, nilai header yang dimasukkan tetap konstan, sehingga Anda dapat menemukan header yang hilang dengan menggunakan alat seperti Ethereal atau tcpmon.

Alternatif autentikasi permintaan string kueri

Anda dapat mengautentikasi jenis permintaan tertentu dengan meneruskan informasi yang diperlukan sebagai parameter string kueri alih-alih menggunakan header. Authorization HTTP Ini berguna untuk mengaktifkan akses peramban pihak ketiga langsung ke data Amazon S3 pribadi Anda tanpa mengajukan permintaan melalui proxy. Idenya adalah untuk membuat permintaan “presigned” dan menyandikannya sebagai URL yang dapat diambil oleh browser pengguna akhir. Selain itu, Anda dapat membatasi sebuah permintaan yang telah ditandatangani sebelumnya dengan menentukan waktu kedaluwarsa.

Untuk informasi selengkapnya tentang penggunaan parameter kueri untuk mengautentikasi permintaan, lihat Mengautentikasi Permintaan: Menggunakan Parameter Kueri (Versi AWS Tanda Tangan 4) di Referensi Layanan API Penyimpanan Sederhana Amazon. Untuk contoh menggunakan AWS SDKs to generating presignedURLs, lihatBerbagi objek dengan presigned URLs.

Membuat tanda tangan

Berikut ini adalah contoh query string diautentikasi Amazon REST S3 permintaan.

GET /photos/puppy.jpg ?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com Date: Mon, 26 Mar 2007 19:37:58 +0000

Metode otentikasi permintaan string kueri tidak memerlukan HTTP header khusus. Sebaliknya, elemen autentikasi yang diperlukan akan ditentukan sebagai parameter string kueri:

Nama parameter string kueri Nilai contoh Deskripsi
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE ID kunci AWS akses Anda. Menentukan kunci akses AWS rahasia yang digunakan untuk menandatangani permintaan dan, secara tidak langsung, identitas pengembang yang membuat permintaan.
Expires 1141889120 Waktu ketika tanda tangan berakhir, ditentukan sebagai jumlah detik sejak zaman (00:00:00 UTC pada 1 Januari 1970). Permintaan yang diterima setelah waktu ini (berdasarkan waktu server) akan ditolak.
Signature vjbyPxybdZaNmGa%2ByT272YEAiv4%3D URLPengkodean pengkodean Base64 dari - dari. HMAC SHA1 StringToSign

Metode autentikasi permintaan string kueri sedikit berbeda dari metode biasa tetapi hanya dalam bentuk format dari parameter permintaan Signature dan elemen StringToSign. Berikut ini adalah pseudo-grammar yang mengilustrasikan metode autentikasi permintaan string kueri.

Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) ); StringToSign = HTTP-VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Expires + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource;

YourSecretAccessKeyadalah ID kunci akses AWS rahasia yang diberikan Amazon kepada Anda saat Anda mendaftar untuk menjadi pengembang Layanan Web Amazon. Perhatikan bagaimana URL -Encoded untuk membuatnya cocok untuk penempatan dalam string query. Signature Perhatikan juga bahwa diStringToSign, elemen HTTP Date posisi telah diganti denganExpires. CanonicalizedAmzHeaders dan CanonicalizedResource sama.

catatan

Dalam metode autentikasi string kueri, Anda tidak menggunakan Date atau x-amz-date request saat menghitung string yang akan ditandatangani.

Autentikasi permintaan string kueri

Permintaan StringToSign
GET /photos/puppy.jpg?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE& Signature=NpgCjnDzrM%2BWFzoENXmpNDUsSn8%3D& Expires=1175139620 HTTP/1.1 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
GET\n \n \n 1175139620\n /awsexamplebucket1/photos/puppy.jpg

Kami berasumsi bahwa ketika browser membuat GET permintaan, browser tidak akan menyediakan header Content- MD5 atau Content-Type, juga tidak akan menyetel header x-amz-, sehingga bagian-bagian tersebut dibiarkan kosong. StringToSign

Menggunakan pengodean Base64

HMACtanda tangan permintaan harus dikodekan Base64. Pengkodean Base64 mengubah tanda tangan menjadi ASCII string sederhana yang dapat dilampirkan ke permintaan. Karakter yang dapat muncul dalam string tanda tangan seperti plus (+), garis miring maju (/), dan sama dengan (=) harus dikodekan jika digunakan dalam file. URI Misalnya, jika kode autentikasi menyertakan tanda tambah (+), konversikan kode tersebut sebagai %2B dalam permintaan. Konversikan kode garis miring menjadi %2F dan sama dengan menjadi %3D.

Untuk contoh pengodean Base64, lihat Amazon S3 Contoh-contoh autentikasi.