Tanda tangan POST V1 mengamankan permintaan unggah yang dikirimkan klien ke Object Storage Service (OSS) melalui operasi PostObject. Server aplikasi menghitung signature berdasarkan kebijakan unggah dan mengirimkannya bersama ke klien, yang kemudian mengirimkan keduanya sebagai field formulir. OSS memverifikasi signature pada setiap permintaan POST dan menolak permintaan dengan signature tidak valid.
OSS mendukung algoritma signature V4 yang lebih aman. (Disarankan) Gunakan penandatanganan V4. Untuk informasi selengkapnya, lihat V4 signature.
Kapan tanda tangan POST V1 diperlukan
Permintaan HTTP POST ke OSS mendukung algoritma signature V1, yang dalam topik ini disebut sebagai penandatanganan POST V1. Sebelum menghitung tanda tangan POST V1, tinjau kondisi dan dependensi berikut:
Bucket ACL — Permintaan PostObject harus menyertakan signature jika ACL bucket tujuan adalah public-read atau private.
Field formulir — Sediakan field formulir
OSSAccessKeyId,Signature, danpolicysebagai satu kelompok. Jika salah satu dari ketiga field tersebut ada dalam formulir, dua field lainnya juga wajib disertakan. Untuk deskripsi tiap field, lihat Form fields.Lokasi perhitungan signature — Server aplikasi menghitung signature dan mengirimkannya bersama kebijakan unggah ke klien. Klien menggunakan informasi ini untuk menyusun permintaan PostObject.
Kredensial — Signature dihitung dari AccessKey secret. Field formulir
OSSAccessKeyIdmembawa ID AccessKey dari Pasangan Kunci Akses yang sama.
Menghitung tanda tangan POST V1
Hitung tanda tangan POST V1 pada server aplikasi Anda dalam tiga langkah berikut:
Buat kebijakan (policy). Buat policy dengan encoding UTF-8. Untuk sintaksis policy dan kondisi yang dapat Anda deklarasikan, lihat Policy structure.
Buat string yang akan ditandatangani (StringToSign). Encode policy dalam Base64. String hasilnya merupakan string yang akan ditandatangani (StringToSign).
Hitung signature. Gunakan AccessKey secret untuk menandatangani string yang akan ditandatangani. Rumus penandatanganan adalah
Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))).
Gambar berikut menunjukkan proses perhitungan tanda tangan POST V1.
Contoh: menghitung tanda tangan POST V1 dalam Java
Contoh Java berikut menjalankan tiga langkah penandatanganan POST V1 terhadap contoh policy yang dijelaskan dalam Policy structure. Langkah 3 memanggil OSS Java SDK, yang menerapkan rumus base64(hmac-sha1(AccessKeySecret,base64(policy))) pada string yang akan ditandatangani.
import org.apache.commons.codec.binary.Base64;
public class Demo {
public static void main(String[] args) {
// Sebelum menjalankan contoh kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_SECRET telah disetel.
String accessKeySecret = System.getenv().get("OSS_ACCESS_KEY_SECRET");
// Langkah 1: Buat policy.
String policy = "{\n" +
" \"expiration\": \"2023-12-03T13:00:00.000Z\",\n" +
" \"conditions\": [\n" +
" {\"bucket\": \"examplebucket\"},\n" +
" [\"content-length-range\", 1, 10],\n" +
" [\"eq\", \"$success_action_status\", \"201\"],\n" +
" [\"starts-with\", \"$key\", \"user/eric/\"],\n" +
" [\"in\", \"$content-type\", [\"image/jpeg\", \"image/png\"]],\n" +
" [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
" ]\n" +
"}";
// Langkah 2: Buat string yang akan ditandatangani (StringToSign).
String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));
// Langkah 3: Hitung signature.
String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
System.out.println("signature:" + signature);
}
}Signature dicetak dalam format berikut. Nilai yang dicetak merupakan string yang diencode Base64, yang bergantung pada AccessKey secret Anda dan byte eksak dari policy Anda, sehingga output Anda akan berbeda dari contoh berikut.
signature:****Kirimkan nilai yang dihitung dalam field formulir Signature pada permintaan PostObject, bersama dengan field formulir OSSAccessKeyId dan policy.
Field formulir
Elemen formulir berikut khusus untuk penandatanganan POST V1. Untuk elemen formulir umum lainnya, lihat PostObject form elements. Untuk kondisi yang mewajibkan penggunaan field ini, lihat Kapan tanda tangan POST V1 diperlukan.
| Field | Type | Description |
| OSSAccessKeyId | String | ID AccessKey dalam Pasangan Kunci Akses. Nilai default: Tidak ada. |
| Signature | String | Signature yang dihitung dari AccessKey secret dan policy. OSS menggunakan signature ini untuk memverifikasi validitas permintaan POST. Nama field formulir ini tidak peka huruf besar/kecil, tetapi nilainya peka huruf besar/kecil. Nilai default: Tidak ada. Untuk cara OSS memverifikasi signature permintaan POST, lihat PostObject. |
| policy | String | Kebijakan keamanan yang mendeklarasikan izin dan batasan unggah. Policy didefinisikan dalam format JSON dan harus mencakup field expiration dan conditions. Untuk detailnya, lihat Policy structure. |
Struktur policy
Field formulir policy adalah kebijakan keamanan yang mendefinisikan izin dan batasan untuk mengunggah objek ke OSS melalui formulir HTML. Policy didefinisikan dalam format JSON dan membatasi operasi unggah melalui beberapa parameter, seperti nama bucket yang diizinkan, awalan objek, waktu kedaluwarsa, metode HTTP yang diizinkan, batas ukuran konten, dan pembatasan tipe konten.
Policy harus mencakup field expiration dan conditions, seperti yang ditunjukkan pada contoh berikut.
{
"expiration": "2023-12-03T13:00:00.000Z",
"conditions": [
{"bucket": "examplebucket"},
["content-length-range", 1, 10],
["eq", "$success_action_status", "201"],
["starts-with", "$key", "user/eric/"],
["in", "$content-type", ["image/jpeg", "image/png"]],
["not-in", "$cache-control", ["no-cache"]]
]
}Policy berisi elemen-elemen berikut:
expiration — Menentukan waktu kedaluwarsa policy dalam format ISO 8601 GMT. Misalnya,
2023-12-03T13:00:00.000Zberarti permintaan POST harus diajukan sebelum pukul 13.00 GMT pada 3 Desember 2023.conditions — Menentukan nilai yang valid untuk field formulir dalam permintaan POST.
Tabel berikut menjelaskan field yang dapat Anda deklarasikan dalam conditions.
| Field | Type | Required | Description | Condition matching modes |
| bucket | String | Tidak | Nama bucket. | bucket |
| content-length-range | String | Tidak | Ukuran minimum dan maksimum objek yang diizinkan untuk diunggah, dalam byte. | content-length-range |
| success_action_status | String | Tidak | Kode status HTTP yang dikembalikan setelah unggah berhasil. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| key | String | Tidak | Nama objek yang akan diunggah. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| content-type | String | Tidak | Membatasi tipe konten objek yang akan diunggah. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
| cache-control | String | Tidak | Menentukan perilaku caching objek. | eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci |
Mode pencocokan kondisi
Tabel berikut menjelaskan mode pencocokan kondisi yang dapat Anda gunakan dalam field conditions pada policy POST V1.
| Mode pencocokan kondisi | Description |
| content-length-range | Menentukan ukuran objek minimum dan maksimum yang diizinkan untuk unggah. Misalnya, untuk mengizinkan ukuran objek dari 1 hingga 10 byte, tulis ["content-length-range", 1, 10]. |
| eq | Melakukan pencocokan eksak. Nilai field formulir harus persis sama dengan nilai yang dideklarasikan dalam kondisi. Misalnya, untuk mewajibkan nilai field formulir key menjadi a, tulis ["eq", "$key", "a"]. |
| starts-with | Melakukan pencocokan awalan. Nilai field formulir harus diawali dengan awalan yang ditentukan. Misalnya, untuk mewajibkan nilai field formulir key diawali dengan user/user1, tulis ["starts-with", "$key", "user/user1"]. |
| in | Memeriksa apakah nilai termasuk dalam daftar string tertentu. Misalnya, saat Anda mengunggah gambar melalui operasi PostObject dan ingin mengizinkan beberapa format gambar, gunakan ["in", "$content-type", ["image/jpeg", "image/png"]]. |
| not-in | Memeriksa apakah nilai tidak termasuk dalam daftar string tertentu. Misalnya, saat Anda mengunggah objek melalui operasi PostObject dan ingin melarang nilai no-cache untuk perilaku cache, gunakan ["not-in", "$cache-control", ["no-cache"]]. |
| eq-ci | Melakukan pencocokan eksak tanpa membedakan huruf besar/kecil. Nilai field formulir harus sesuai dengan nilai yang dideklarasikan dalam kondisi. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["eq-ci", "$key", "AbC"], nama objek seperti abc, ABC, dan aBc semuanya cocok. |
| starts-with-ci | Melakukan pencocokan awalan tanpa membedakan huruf besar/kecil. Nilai field formulir harus diawali dengan awalan yang ditentukan. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["starts-with-ci", "$key", "User/"], nilai yang diawali dengan user/, USER/, atau User/ semuanya cocok. |
| in-ci | Melakukan pemeriksaan tanpa membedakan huruf besar/kecil untuk menentukan apakah nilai termasuk dalam daftar string tertentu. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["in-ci", "$content-type", ["IMAGE/JPEG", "image/PNG"]], nilai seperti image/jpeg dan IMAGE/PNG semuanya cocok. |
| not-in-ci | Melakukan pemeriksaan tanpa membedakan huruf besar/kecil untuk menentukan apakah nilai tidak termasuk dalam daftar string tertentu. Perbandingan dilakukan dalam huruf kecil. Misalnya, untuk ["not-in-ci", "$cache-control", ["No-Cache"]], nilai seperti no-cache, NO-CACHE, dan No-Cache semuanya dikecualikan. |
Karakter escape policy
Dalam policy POST, tanda dolar ($) merepresentasikan variabel. Untuk menyertakan tanda dolar literal, gunakan karakter escape \$. Tabel berikut menjelaskan karakter yang harus di-escape dalam JSON policy.
| Karakter escape | Description |
| \/ | Garis miring maju |
| \\ | Garis miring terbalik |
| \" | Tanda kutip ganda |
| \$ | Tanda dolar |
| \b | Spasi |
| \f | Form feed |
| \n | Line break |
| \r | Carriage return |
| \t | Tab Horizontal |
| \uxxxx | Karakter Unicode |