Alih-alih menyertakan informasi autentikasi dalam header Authorization, Anda dapat menyematkannya langsung ke dalam URL sebagai parameter string kueri. Pendekatan ini memungkinkan Anda berbagi tautan berbatas waktu ke resource Object Storage Service (OSS) tanpa mengekspos kredensial akses Anda.
Gunakan algoritma signature V4 untuk keamanan yang lebih baik. Lihat Sertakan signature V4 dalam URL (disarankan).
Gunakan SDK untuk menghasilkan URL yang ditandatangani
SDK OSS menangani penandatanganan V1 secara otomatis. Jika Anda menggunakan SDK, Anda tidak perlu membuat signature secara manual. Tabel berikut mencantumkan implementasi penandatanganan dan contoh penggunaannya untuk setiap bahasa yang didukung.
| SDK | Implementasi penandatanganan | Contoh penggunaan |
|---|---|---|
| Java | OSSV1Signer.java | Java |
| PHP | SignerV1.php | PHP |
| Node.js | signatureUrl.js | Node.js |
| Browser.js | Browser.js | — |
| Python | auth.py | Python |
| Android | ObjectURLPresigner.java | Android |
| iOS | OSSClient.m | iOS |
| Go | v1.go | Go |
| C++ | SignerV1.cc | C++ |
| C | oss_auth.c | C |
| .NET | OssClient.cs | .NET |
| Ruby | bucket.rb | Ruby |
Buat URL yang ditandatangani secara manual
Untuk membuat URL yang ditandatangani sendiri, Anda memerlukan:
ID AccessKey dan rahasia AccessKey, atau kredensial akses temporary dari Security Token Service (STS)
Nama bucket dan path objek dari resource target
Metode HTTP yang dimaksud (
GET,PUT, dan sebagainya)Waktu kedaluwarsa dalam bentuk Unix timestamp
Format URL
URL yang ditandatangani V1 memiliki struktur berikut:
https://<bucket>.oss-<region>.aliyuncs.com/<object>?OSSAccessKeyId=<key-id>&Expires=<unix-timestamp>&Signature=<encoded-signature>Untuk menggunakan kredensial akses temporary dari STS, tambahkan parameter security-token:
https://<bucket>.oss-<region>.aliyuncs.com/<object>?OSSAccessKeyId=<key-id>&Expires=<unix-timestamp>&Signature=<encoded-signature>&security-token=<sts-token>Untuk membatasi akses berdasarkan alamat IP atau virtual private cloud (VPC), sertakan parameter kontrol akses yang sesuai:
https://<bucket>.oss-<region>.aliyuncs.com/<object>?OSSAccessKeyId=<key-id>&Expires=<unix-timestamp>&Signature=<encoded-signature>&x-oss-ac-subnet-mask=32Parameter URL
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
OSSAccessKeyId | String | Ya | ID AccessKey yang digunakan untuk menandatangani URL. |
Expires | Numerik | Ya | Waktu kedaluwarsa dalam bentuk Unix timestamp (detik sejak 1970-01-01 00:00:00 UTC). OSS menolak permintaan yang diterima setelah waktu ini. Misalnya, jika waktu saat ini adalah 1141889060 dan Anda ingin URL berlaku selama 60 detik, atur nilai ini menjadi 1141889120. Periode validitas default di Konsol OSS adalah 3.600 detik dan maksimum 32.400 detik. Lihat Gunakan URL objek untuk mengubah periode validitas. |
Signature | String | Ya | Signature HMAC-SHA1 yang telah di-encode Base64 lalu di-URL encode. Lihat Formula penandatanganan di bawah. |
security-token | String | Tidak | Token keamanan dari STS. Hanya diperlukan saat menggunakan kredensial akses temporary. Lihat Gunakan kredensial akses temporary yang disediakan oleh STS untuk mengakses OSS. Anda dapat memanggil operasi AssumeRole atau menggunakan SDK STS untuk berbagai bahasa pemrograman untuk mendapatkan kredensial akses temporary. Kredensial akses temporary berisi token keamanan dan pasangan AccessKey sementara (ID AccessKey + rahasia AccessKey). |
x-oss-ac-source-ip | String | Tidak | Alamat IP atau Blok CIDR. Hanya digunakan pada saat pembuatan signature — jangan sertakan dalam URL itu sendiri. Harus digunakan bersama dengan x-oss-ac-subnet-mask. |
x-oss-ac-subnet-mask | Numerik | Tidak | Panjang subnet mask (jumlah bit 1 di awal). OSS melakukan operasi bitwise AND antara IP sumber permintaan dan mask ini untuk memverifikasi signature. Jika parameter ini dimodifikasi, verifikasi signature akan gagal. |
x-oss-ac-vpc-id | String | Tidak | ID VPC. OSS memverifikasi bahwa permintaan berasal dari VPC yang ditentukan, serta memeriksa IP sumber atau Blok CIDR. |
x-oss-ac-forward-allow | Boolean | Tidak | Apakah akan menggunakan header X-Forwarded-For untuk verifikasi signature ketika permintaan diteruskan. Nilai yang valid: true, false (default). Mengatur nilai ini ke true membuka potensi manipulasi terhadap header permintaan. |
Formula penandatanganan
Parameter Signature menggunakan algoritma yang sama dengan header Authorization, dengan satu perbedaan: ganti header Date dengan Expires dalam string yang akan ditandatangani. Anda tetap dapat menyertakan Date dalam permintaan, tetapi jangan sertakan dalam string signature.
Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ CONTENT-MD5 + "\n"
+ CONTENT-TYPE + "\n"
+ EXPIRES + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource)))Untuk CONTENT-MD5, CONTENT-TYPE, dan CanonicalizedOSSHeaders, ikuti aturan yang sama seperti pada signature V1.
JikaSignature,Expires, atauOSSAccessKeyIdmuncul beberapa kali dalam URL, OSS menggunakan nilai pertama. Saat OSS menerima permintaan, OSS terlebih dahulu memeriksaExpires, lalu memverifikasiSignature.
Contoh Python
Contoh berikut menghitung signature V1 untuk permintaan GET hanya dengan menggunakan parameter yang diperlukan.
import base64
import hmac
import hashlib
from urllib.parse import quote
access_key_secret = "yourAccessKeySecret"
string_to_sign = "GET\n\n\n1141889120\n/examplebucket/oss-api.pdf"
h = hmac.new(
access_key_secret.encode('utf-8'),
string_to_sign.encode('utf-8'),
hashlib.sha1
)
signature = quote(base64.b64encode(h.digest()).decode('utf-8'))
print(signature)Ganti nilai placeholder berikut:
| Placeholder | Deskripsi |
|---|---|
yourAccessKeySecret | Rahasia AccessKey Anda |
1141889120 | Unix timestamp kedaluwarsa |
/examplebucket/oss-api.pdf | CanonicalizedResource (/<bucket>/<object>) |
Pertimbangan keamanan
Jika Anda menggunakan URL yang ditandatangani untuk berbagi data, data tersebut dapat diakses oleh semua pengguna Internet yang memiliki URL tersebut selama periode validitasnya. Kami menyarankan agar Anda mengevaluasi risiko terkait data terlebih dahulu.
Untuk mengurangi risiko akses tidak sah:
Batasi akses berdasarkan alamat IP atau VPC menggunakan
x-oss-ac-source-ip,x-oss-ac-subnet-mask, danx-oss-ac-vpc-id.Jangan sertakan signature URL baik di URL maupun di header
Authorizationuntuk permintaan yang sama — OSS akan menolak permintaan semacam itu.
Catatan penggunaan
Untuk permintaan PUT, SDK OSS menghitung hash MD5 dari badan permintaan dan menyertakannya dalam URL yang ditandatangani. Hash MD5 dari konten yang diunggah harus cocok; jika tidak, permintaan PUT akan gagal. Untuk memverifikasi hash MD5, sertakan header
Content-MD5dalam permintaan.x-oss-ac-source-iphanya digunakan saat pembuatan signature. Jangan sertakan parameter ini dalam URL yang Anda bagikan.
Pemecahan masalah
Mengapa saya mendapatkan error 403 AccessDenied?
Periksa penyebab umum berikut:
Salah satu atau lebih dari
OSSAccessKeyId,Expires, atauSignaturetidak ada dalam URL. Ketiganya wajib disertakan (urutan tidak penting).Permintaan tiba setelah timestamp
Expires, atau format timestamp tidak valid. Pastikan jam sistem Anda tersinkronisasi dan nilaiExpiresmerupakan Unix timestamp yang valid di masa depan.
Mengapa saya mendapatkan error 400 InvalidArgument?
OSS tidak mengizinkan signature muncul baik di URL maupun di header Authorization untuk permintaan yang sama. Hapus signature dari salah satu lokasi tersebut.