Contoh ini menunjukkan cara menandatangani permintaan PutObject secara manual di Node.js—membangun string yang akan ditandatangani, menghitung signature HMAC-SHA1, dan menyetel header Authorization—tanpa menggunakan OSS SDK (software development kit).
Gunakan OSS SDK untuk aplikasi produksi. Penandatanganan manual berguna ketika Anda tidak dapat menggunakan SDK atau perlu memahami mekanisme autentikasi yang mendasarinya.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Node.js versi 12.10.0 atau lebih baru yang telah diinstal
Bucket OSS
ID AccessKey dan rahasia AccessKey dengan izin menulis ke bucket tersebut
Paket npm berikut yang telah diinstal:
npm install crypto-js request
Cara kerja penandatanganan
OSS mengotentikasi setiap permintaan menggunakan signature dalam header Authorization. Signature dihitung dari string yang akan ditandatangani, yang menyandikan metode permintaan, tipe konten, tanggal, dan jalur resource.
Rumus String-to-sign:
StringToSign = HTTP-Verb + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedResourceFormat header Authorization:
Authorization: OSS <AccessKeyId>:<Signature>
Signature = Base64(HMAC-SHA1(AccessKeySecret, StringToSign))Referensi field:
| Field | Wajib | Deskripsi |
|---|---|---|
HTTP-Verb | Ya | Metode HTTP dalam huruf kapital, misalnya PUT |
Content-MD5 | Tidak | Hash MD5 dari badan permintaan. Gunakan string kosong jika dihilangkan. |
Content-Type | Tidak | Tipe MIME dari badan permintaan. Gunakan string kosong jika dihilangkan. |
Date | Ya | Waktu permintaan dalam format GMT, misalnya Mon, 02 Mar 2026 08:00:00 GMT |
CanonicalizedResource | Ya | Nama bucket dan kunci objek yang diawali garis miring, misalnya /mybucket/mytest/nodejs.txt |
Contoh: cara permintaan PutObject dipetakan ke string yang akan ditandatangani
Request StringToSign
PUT /mytest/nodejs.txt HTTP/1.1 PUT\n
Content-Type: application/json \n
Date: Mon, 02 Mar 2026 08:00:00 GMT application/json\n
Host: mybucket.oss-cn-hangzhou... Mon, 02 Mar 2026 08:00:00 GMT\n
/mybucket/mytest/nodejs.txtPerhatikan bahwa Content-MD5 tidak ada dalam permintaan, sehingga menjadi string kosong dalam string yang akan ditandatangani.
Tandatangani dan unggah objek
Kode Node.js berikut menandatangani permintaan PutObject menggunakan HMAC-SHA1 dan mengunggah objek ke OSS.
var HmacSha1 = require('crypto-js/hmac-sha1');
var Base64 = require('crypto-js/enc-base64');
var request = require('request');
// Konfigurasi — ganti placeholder dengan nilai aktual Anda
var endpoint = 'http://oss-cn-hangzhou.aliyuncs.com'; // <region-endpoint>
var bucketName = 'xxx'; // <your-bucket-name>
var objectName = 'mytest/nodejs.txt'; // <your-object-name>
var accesskey = 'xxxx'; // <your-accesskey-id>
var accesskeysecret = 'xxx'; // <your-accesskey-secret>
// Bangun string yang akan ditandatangani
var gmtDate = (new Date()).toGMTString();
var contenttype = 'application/json';
var strtosign = 'PUT\n\n' + contenttype + '\n' + gmtDate + '\n' + '/' + bucketName + '/' + objectName;
// Hitung signature
var sign = Base64.stringify(HmacSha1(strtosign, accesskeysecret));
// Kirim permintaan PUT
var options = {
url: 'http://' + bucketName + '.oss-cn-hangzhou.aliyuncs.com/' + objectName,
headers: {
'Content-Type': contenttype,
'Date': gmtDate,
'Authorization': 'OSS ' + accesskey + ':' + sign
},
body: '{test:test}'
};
request.put(options, function(error, response, body) {
console.info('response: ' + JSON.stringify(response));
console.info('statusCode: ' + response.statusCode);
console.info('body: ' + body);
});Ganti placeholder berikut dengan nilai aktual Anda:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<region-endpoint> | Titik akhir OSS untuk wilayah Anda | http://oss-cn-hangzhou.aliyuncs.com |
<your-bucket-name> | Nama bucket Anda | my-bucket |
<your-object-name> | Jalur objek target di dalam bucket | mytest/nodejs.txt |
<your-accesskey-id> | ID AccessKey Anda | LTAI5tXxx |
<your-accesskey-secret> | Rahasia AccessKey Anda | xXxXxXx |
Pemecahan masalah
`SignatureDoesNotMatch`
Galat ini berarti signature yang dihitung OSS dari permintaan Anda tidak sesuai dengan yang Anda kirimkan. Periksa hal berikut:
Header
Datemenggunakan format GMT yang valid dan sesuai dengan nilai yang digunakan dalam string yang akan ditandatangani.Content-Typedalam string yang akan ditandatangani persis sama dengan headerContent-Type, termasuk besar-kecil hurufnya.CanonicalizedResourcediawali dengan/diikuti nama bucket dan kunci objek:/bucketName/objectName.Jika
Content-MD5atauContent-Typetidak ada dalam permintaan, gunakan string kosong ("") pada posisi tersebut dalam string yang akan ditandatangani.Rahasia AccessKey yang digunakan untuk menghitung signature benar dan belum dirotasi.
`403 Access Denied`
Verifikasi bahwa ID AccessKey dan rahasia AccessKey valid serta akun terkait memiliki izin oss:PutObject pada bucket target.
Langkah selanjutnya
Sertakan signature dalam header Authorization — spesifikasi lengkap untuk penandatanganan permintaan OSS