All Products
Search
Document Center

Object Storage Service:Contoh mengunggah header signature di OSS menggunakan Python

Last Updated:Mar 21, 2026

Contoh ini menunjukkan cara membuat header Authorization secara manual dan mengunggah objek ke OSS menggunakan API PutObject di Python 2.7, tanpa mengandalkan penandatanganan otomatis dari SDK OSS.

Catatan

Untuk lingkungan produksi, gunakan OSS SDK, yang secara otomatis menangani penandatanganan permintaan. Contoh ini hanya disarankan jika Anda tidak dapat menggunakan SDK—misalnya, saat mengintegrasikan OSS ke dalam stack HTTP kustom atau melakukan debugging alur autentikasi.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Akun Alibaba Cloud dengan ID AccessKey dan Rahasia AccessKey

  • Bucket OSS di wilayah oss-cn-hangzhou (atau perbarui titik akhir sesuai wilayah bucket Anda)

  • File lokal yang akan diunggah

  • Python 2.7 dengan pustaka standar tersedia (hmac, base64, urllib2)

Cara kerja

Permintaan PutObject yang ditandatangani memerlukan tiga header:

HeaderDeskripsi
AuthorizationMengotentikasi permintaan. Format: OSS <AccessKeyID>:<Base64(HMAC-SHA1(StringToSign))>
Content-TypeJenis MIME dari objek yang diunggah (misalnya, image/png)
DateWaktu UTC saat ini dalam format GMT, yang harus sesuai dengan waktu yang digunakan saat menghitung signature

Format header Authorization

Header Authorization memiliki struktur berikut:

OSS <AccessKeyID>:<Signature>
KomponenDeskripsi
OSSAwalan tetap yang mengidentifikasi skema penandatanganan Alibaba Cloud OSS
<AccessKeyID>ID AccessKey Anda
:Pembatas antara ID AccessKey dan signature
<Signature>Hash HMAC-SHA1 yang dikodekan Base64 dari string-to-sign

Format string-to-sign

String-to-sign dibuat sebagai berikut:

PUT\n
\n
<Content-Type>\n
<Date>\n
/<bucket>/<object>

Di mana setiap \n adalah karakter baris baru literal.

Mengunggah objek dengan permintaan yang ditandatangani

Kode Python 2.7 berikut membuat signature dan mengunggah objek menggunakan API PutObject.

Ganti nilai placeholder sebelum menjalankan:

PlaceholderDeskripsiContoh
Your accesskeyID AccessKey AndaLTAI5tXxxx
Your AccesskeySecretRahasia AccessKey AndaxXxXxXx
Your bucket nameNama bucket OSS Andaexamplebucket
/Users/wanghe/Documents/20190717101549.pngJalur lokal file yang akan diunggah/path/to/your/file.png
# -*- coding: utf-8 -*-
import base64
import hmac
import sha
import urllib2
from datetime import datetime


accesskey='Your accesskey';
accesskeysecret='Your AccesskeySecret
endpoint='oss-cn-hangzhou.aliyuncs.com'
bucket='Your bucket name'
# Jalur objek yang ingin Anda unggah.
object='mytest/test.png'
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'


time = datetime.utcnow().strftime(GMT_FORMAT)
print(time)
signature = hmac.new(accesskeysecret,
"PUT\n\nimage/png\n"+time+"\n"+"/"+bucket+"/"+object,sha)
Signature = base64.b64encode(signature.digest())
print("Signature: %s" % Signature)
opener = urllib2.build_opener(urllib2.HTTPHandler)
with open("/Users/wanghe/Documents/20190717101549.png") as f:
data=f.read()
request = urllib2.Request("http://"+bucket+"."+endpoint+"/"+object, data=data)
request.add_header("Authorization", "OSS "+accesskey+":"+Signature)
request.add_header("Content-Type", "image/png")
request.add_header("Date", time)
request.get_method = lambda:"PUT"
url = opener.open(request)

Pemecahan masalah

Jika signature salah, OSS mengembalikan error 403 SignatureDoesNotMatch. Penyebab umum meliputi:

  • Nilai Date yang digunakan untuk menghitung signature tidak sesuai dengan header Date yang dikirim dalam permintaan

  • String-to-sign tidak menggunakan karakter baris baru literal di antara setiap bidang

  • Nilai Content-Type dalam string-to-sign tidak sesuai dengan header Content-Type dalam permintaan

Langkah selanjutnya