Proses Penandatanganan V2

Halaman ini memberikan ringkasan URL yang ditandatangani saat menangani proses penandatanganan V2, yang merupakan mekanisme autentikasi string kueri untuk bucket dan objek. URL yang ditandatangani menyediakan cara untuk memberikan akses baca atau tulis dalam waktu terbatas kepada siapa pun yang memiliki URL, terlepas dari apakah mereka memiliki Akun Google atau tidak.

Komponen string yang memerlukan penandatanganan

Saat membuat URL bertanda tangan menggunakan program, program Anda akan membuat string yang akan ditandatangani. String ini harus ditentukan dalam program Anda sebagai:

StringToSign = HTTP_Verb + "\n" +
               Content_MD5 + "\n" +
               Content_Type + "\n" +
               Expires + "\n" +
               Canonicalized_Extension_Headers +
               Canonicalized_Resource

Komponen yang membentuk struktur ini dijelaskan dalam tabel berikut:

Komponen String Contoh Deskripsi
HTTP_Verb GET Wajib diisi. Kata kerja HTTP yang akan digunakan dengan URL bertanda tangan.

Catatan: Kata kerja HTTP POST tidak didukung dalam string URL bertanda tangan, kecuali seperti yang disebutkan di atas. Anda dapat menggunakan POST untuk menentukan dokumen kebijakan yang ditandatangani, yang menentukan karakteristik objek yang dapat diupload ke bucket. Pelajari lebih lanjut di dokumentasi POST Object.

Content_MD5 rmYdCNHKFXam78uCt7xQLw== Opsional. Nilai digest MD5 di Base64. Jika Anda memberikan ini dalam string, klien (biasanya browser) harus memberikan header HTTP ini dengan nilai yang sama dalam permintaannya.
Content_Type text/plain Sesuai kebutuhan. Jika Anda memberikan content-type, klien (browser) harus memberikan header HTTP ini yang ditetapkan ke nilai yang sama.
Expires 1388534400 Wajib diisi. Ini adalah stempel waktu (diwakili sebagai jumlah detik sejak Epoch Unix 00:00:00 UTC pada 1 Januari 1970) ketika tanda tangan berakhir. Server menolak permintaan apa pun yang diterima setelah stempel waktu ini, serta permintaan apa pun yang diterima setelah kunci yang digunakan untuk menghasilkan URL bertanda tangan dirotasi. Untuk keamanan dan kompatibilitas dengan proses penandatanganan V4, Anda harus menetapkan Expires agar sesuai dengan maksimum 1 minggu (604800 detik) di masa mendatang.
Canonicalized_Extension_Headers x-goog-acl:public-read\nx-goog-meta-foo:bar,baz\n Sesuai kebutuhan. Server akan memeriksa untuk memastikan bahwa klien memberikan nilai yang cocok dalam permintaan menggunakan URL yang ditandatangani. Untuk mengetahui informasi tentang cara membuat header kanonis untuk penandatanganan, lihat Header ekstensi kanonis.
Canonicalized_Resource /bucket/objectname Wajib diisi. Resource yang dirujuk dalam URL. Untuk mengetahui detail selengkapnya, lihat Resource kanonis.

Menandatangani string dengan layanan App Identity App Engine

Saat membuat URL bertanda tangan menggunakan program, Anda dapat menandatangani string tersebut dari dalam program, atau dari dalam aplikasi Google App Engine menggunakan layanan App Engine Identity, yang menggunakan kredensial akun layanan App Engine Anda. Misalnya, dengan menggunakan Python App Identity API, Anda dapat:

  • Menggunakan google.appengine.api.app_identity.sign_blob() untuk menandatangani byte dari string yang Anda buat, menyediakan Signature yang Anda perlukan saat menyusun URL yang ditandatangani.

  • Menggunakan google.appengine.api.app_identity.get_service_account_name() untuk mengambil nama akun layanan, yang merupakan GoogleAccessId yang Anda perlukan saat menyusun URL yang ditandatangani.

Untuk mendapatkan dukungan dalam bahasa lain, lihat Ringkasan App Identity API untuk Java, Ringkasan App Identity API untuk PHP, dan Fungsi App Identity dalam lingkungan pengembangan Go.

Layanan App Identity merotasi kunci pribadi saat menandatangani blob. URL bertanda tangan yang dihasilkan dari layanan App Identity hanya dapat digunakan selama satu jam dan paling baik digunakan untuk akses jangka pendek ke resource.

Header ekstensi kanonis

Saat membuat URL bertanda tangan menggunakan program, Anda harus membuat bagian Header Ekstensi Kanonis dari pesan dengan menyambungkan semua header ekstensi (kustom) yang dimulai dengan x-goog-. Namun, Anda tidak dapat melakukan penyambungan sederhana. Ingatlah algoritma berikut saat Anda membuat header:

  1. Gunakan huruf kecil untuk semua nama header kustom.

  2. Mengurutkan semua header kustom berdasarkan nama header menggunakan pengurutan leksikografis menurut nilai poin kode.

  3. Jika ada, hapus header x-goog-encryption-key dan x-goog-encryption-key-sha256. Header ini berisi informasi sensitif yang tidak boleh disertakan dalam string-to-sign; tetapi header ini tetap harus digunakan dalam permintaan apa pun yang menggunakan URL bertanda tangan yang dihasilkan.

  4. Hapus nama header duplikat dengan membuat satu nama header menggunakan daftar nilai yang dipisahkan koma. Pastikan tidak ada spasi kosong di antara nilai-nilai tersebut, dan pastikan urutan daftar yang dipisahkan koma sesuai dengan urutan header yang muncul dalam permintaan Anda. Untuk informasi selengkapnya, lihat RFC 7230 bagian 3.2.

  5. Ganti semua spasi kosong lipat atau baris baru (CRLF atau LF) dengan satu spasi. Untuk informasi selengkapnya tentang spasi kosong lipat, lihat RFC 7230, bagian 3.2.4..

  6. Hapus spasi kosong di sekitar titik dua yang muncul setelah nama header.

  7. Tambahkan baris baru "\n" (U+000A) ke setiap header kustom.

  8. Sambungkan semua header kustom.

Resource kanonis

Ketika membuat URL bertanda tangan menggunakan program, Anda harus membuat bagian Resource yang Dikanonikalisasi dari pesan dengan menyambungkan jalur resource (bucket dan objek serta subresource) yang menjadi target permintaan. Perhatikan hal berikut saat Anda membuat resource:

  • Resource kanonis adalah segala hal setelah nama host. Misalnya, jika URL Cloud Storage adalah https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg, resource kanonisnya adalah /example-bucket/cat-pics/tabby.jpeg.

  • Jika permintaan tercakup dalam subresource, seperti ?cors, tambahkan subresource ini, termasuk tanda tanya, ke akhir string.

  • Pastikan untuk menyalin jalur permintaan HTTP secara literal: artinya, Anda harus menyertakan semua encoding URL (tanda persen) dalam string yang Anda buat. Selain itu, pastikan Anda hanya menyertakan parameter string kueri yang menunjukkan subresource (misalnya cors). Anda tidak boleh menyertakan parameter string kueri seperti ?prefix, ?max-keys, ?marker, dan ?delimiter.