All Products
Search
Document Center

Object Storage Service:Gunakan Node.js untuk mengunggah objek dengan header bertanda tangan ke OSS

Last Updated:Mar 21, 2026

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"
             + CanonicalizedResource

Format header Authorization:

Authorization: OSS <AccessKeyId>:<Signature>
Signature = Base64(HMAC-SHA1(AccessKeySecret, StringToSign))

Referensi field:

FieldWajibDeskripsi
HTTP-VerbYaMetode HTTP dalam huruf kapital, misalnya PUT
Content-MD5TidakHash MD5 dari badan permintaan. Gunakan string kosong jika dihilangkan.
Content-TypeTidakTipe MIME dari badan permintaan. Gunakan string kosong jika dihilangkan.
DateYaWaktu permintaan dalam format GMT, misalnya Mon, 02 Mar 2026 08:00:00 GMT
CanonicalizedResourceYaNama 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.txt

Perhatikan 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:

PlaceholderDeskripsiContoh
<region-endpoint>Titik akhir OSS untuk wilayah Andahttp://oss-cn-hangzhou.aliyuncs.com
<your-bucket-name>Nama bucket Andamy-bucket
<your-object-name>Jalur objek target di dalam bucketmytest/nodejs.txt
<your-accesskey-id>ID AccessKey AndaLTAI5tXxx
<your-accesskey-secret>Rahasia AccessKey AndaxXxXxXx

Pemecahan masalah

`SignatureDoesNotMatch`

Galat ini berarti signature yang dihitung OSS dari permintaan Anda tidak sesuai dengan yang Anda kirimkan. Periksa hal berikut:

  • Header Date menggunakan format GMT yang valid dan sesuai dengan nilai yang digunakan dalam string yang akan ditandatangani.

  • Content-Type dalam string yang akan ditandatangani persis sama dengan header Content-Type, termasuk besar-kecil hurufnya.

  • CanonicalizedResource diawali dengan / diikuti nama bucket dan kunci objek: /bucketName/objectName.

  • Jika Content-MD5 atau Content-Type tidak 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