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.
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:
| Header | Deskripsi |
|---|---|
Authorization | Mengotentikasi permintaan. Format: OSS <AccessKeyID>:<Base64(HMAC-SHA1(StringToSign))> |
Content-Type | Jenis MIME dari objek yang diunggah (misalnya, image/png) |
Date | Waktu 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>| Komponen | Deskripsi |
|---|---|
OSS | Awalan 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:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
Your accesskey | ID AccessKey Anda | LTAI5tXxxx |
Your AccesskeySecret | Rahasia AccessKey Anda | xXxXxXx |
Your bucket name | Nama bucket OSS Anda | examplebucket |
/Users/wanghe/Documents/20190717101549.png | Jalur 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
Dateyang digunakan untuk menghitung signature tidak sesuai dengan headerDateyang dikirim dalam permintaanString-to-sign tidak menggunakan karakter baris baru literal di antara setiap bidang
Nilai
Content-Typedalam string-to-sign tidak sesuai dengan headerContent-Typedalam permintaan
Langkah selanjutnya
Add signatures to headers — referensi lengkap untuk algoritma signature OSS