Secara default, daftar kontrol akses (ACL) dari sebuah objek dalam bucket Object Storage Service (OSS) bersifat pribadi. Hanya pemilik objek yang memiliki izin untuk mengakses objek tersebut. Topik ini menjelaskan cara menggunakan OSS SDK untuk Python untuk menghasilkan URL yang ditandatangani yang memungkinkan pengguna mengunduh objek tertentu dalam periode waktu yang ditentukan menggunakan metode HTTP GET. Selama periode validitas, pengguna dapat mengakses objek berulang kali menggunakan URL yang ditandatangani. Jika URL yang ditandatangani kedaluwarsa, Anda dapat menghasilkan kembali URL tersebut untuk memperpanjang akses bagi pengguna.
Catatan Penggunaan
Kode contoh dalam topik ini menggunakan ID wilayah
cn-hangzhoudari Wilayah Hangzhou, Tiongkok. Secara default, titik akhir publik digunakan untuk mengakses sumber daya dalam bucket. Jika Anda ingin mengakses sumber daya di bucket dari layanan Alibaba Cloud lainnya di wilayah yang sama dengan lokasi bucket, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir.Anda tidak memerlukan izin khusus untuk menghasilkan URL yang ditandatangani. Namun, untuk mengizinkan orang lain menggunakan URL yang ditandatangani untuk mengunduh objek, Anda harus memiliki izin
oss:GetObject. Untuk informasi lebih lanjut, lihat Contoh Umum Kebijakan RAM.Dalam topik ini, algoritma tanda tangan V4 digunakan untuk menghasilkan URL yang ditandatangani dengan periode validitas hingga 7 hari. Untuk informasi lebih lanjut, lihat (Direkomendasikan) Tanda Tangan V4 dalam URL yang Ditandatangani.
Proses
Bagan alir berikut menunjukkan cara mengunduh objek menggunakan URL yang ditandatangani.
Definisi Metode
Anda dapat memanggil metode presign untuk menghasilkan URL yang ditandatangani yang memberikan akses terbatas waktu ke objek OSS. URL yang ditandatangani dapat digunakan beberapa kali sebelum kedaluwarsa.
Baris berikut menunjukkan sintaksis metode presign:
presign(request: GetObjectRequest, **kwargs) → PresignResultParameter Permintaan
Parameter | Tipe | Deskripsi |
request | GetObjectRequest | Operasi API yang ingin Anda dukung dengan URL yang ditandatangani. Untuk informasi lebih lanjut, lihat Client.presign. |
expires | datetime.timedelta | Periode validitas URL yang ditandatangani mulai dari waktu saat ini. Ini adalah parameter opsional. Misalnya, jika Anda ingin menetapkan periode validitas selama 30 menit, atur expires menjadi 30 * time.Minute. Jika Anda tidak menentukan parameter ini, URL yang ditandatangani akan memiliki periode validitas default selama 15 menit. |
expiration | datetime.datetime | Tanggal dan waktu kedaluwarsa absolut dari URL yang ditandatangani. Ini adalah parameter opsional. |
Jika Anda menggunakan algoritma tanda tangan V4, periode validitas bisa mencapai tujuh hari. Jika Anda menentukan expiration dan expires, expiration akan diutamakan.
Parameter Tanggapan
Tipe | Deskripsi |
PresignResult | Hasil yang dikembalikan, termasuk URL yang ditandatangani, metode HTTP, waktu kedaluwarsa, dan header permintaan yang ditentukan dalam permintaan. Untuk informasi lebih lanjut, lihat PresignResult. |
Isi dari PresignResult
Parameter | Tipe | Deskripsi |
method | str | Metode HTTP, yang sesuai dengan operasi API yang ditentukan dalam permintaan presign. Sebagai contoh, metode HTTP dari operasi GetObject adalah GET. |
url | str | URL yang ditandatangani. |
expiration | datetime | Waktu kedaluwarsa dari URL yang ditandatangani. |
signed_headers | MutableMapping | Header yang ditandatangani yang ditentukan dalam permintaan. Sebagai contoh, jika content_type ditentukan, content_type akan dikembalikan. |
Untuk informasi lebih lanjut tentang metode presign, lihat presign.
Kode Contoh
Hasilkan URL yang ditandatangani yang mengizinkan permintaan HTTP GET:
import argparse import alibabacloud_oss_v2 as oss # Buat parser parameter baris perintah dan jelaskan tujuan dari skrip. parser = argparse.ArgumentParser(description="contoh presign get object") # Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib. parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True) # Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib. parser.add_argument('--bucket', help='Nama bucket.', required=True) # Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional. parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS') # Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib. parser.add_argument('--key', help='Nama objek.', required=True) def main(): # Parse parameter baris perintah untuk mendapatkan nilai yang ditentukan. args = parser.parse_args() # Dari variabel lingkungan, muat informasi autentikasi yang diperlukan untuk mengakses OSS. credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() # Gunakan konfigurasi default untuk membuat objek cfg dan tentukan penyedia kredensial. cfg = oss.config.load_default() cfg.credentials_provider = credentials_provider # Atur atribut region objek cfg ke wilayah yang diberikan di baris perintah. cfg.region = args.region # Jika titik akhir kustom diberikan, perbarui atribut endpoint objek cfg dengan titik akhir yang diberikan. if args.endpoint is not None: cfg.endpoint = args.endpoint # Gunakan pengaturan sebelumnya untuk menginisialisasi instance OSSClient. client = oss.Client(cfg) # Mulai permintaan untuk menghasilkan URL yang ditandatangani. pre_result = client.presign( oss.GetObjectRequest( bucket=args.bucket, # Tentukan nama bucket. key=args.key, # Tentukan kunci objek. ) ) # Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang ditandatangani. print(f'method: {pre_result.method},' f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},' f' url: {pre_result.url}' ) # Tampilkan header yang ditandatangani. for key, value in pre_result.signed_headers.items(): print(f'signed headers key: {key}, signed headers value: {value}') # Panggil fungsi utama untuk memulai logika pemrosesan ketika skrip dijalankan langsung. if __name__ == "__main__": main() # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.Gunakan URL yang ditandatangani untuk mengunduh objek.
curl
curl -SO "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"Java
import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class Demo { public static void main(String[] args) { // Tentukan URL yang ditandatangani yang mengizinkan permintaan HTTP GET. String fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; // Tentukan jalur tempat objek yang diunduh akan disimpan, termasuk nama objek dan ekstensi. String savePath = "C:/downloads/myfile.txt"; try { downloadFile(fileURL, savePath); System.out.println("Unduhan selesai!"); } catch (IOException e) { System.err.println("Kesalahan selama unduhan: " + e.getMessage()); } } private static void downloadFile(String fileURL, String savePath) throws IOException { URL url = new URL(fileURL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); httpConn.setRequestMethod("GET"); // Tentukan kode respons. int responseCode = httpConn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // Konfigurasikan input stream. InputStream inputStream = new BufferedInputStream(httpConn.getInputStream()); // Konfigurasikan output stream. FileOutputStream outputStream = new FileOutputStream(savePath); byte[] buffer=new byte[4096]; // Tentukan ukuran buffer. int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); } else { System.out.println("Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: " + responseCode); } httpConn.disconnect(); } }Node.js
const https = require('https'); const fs = require('fs'); const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; const savePath = "C:/downloads/myfile.txt"; https.get(fileURL, (response) => { if (response.statusCode === 200) { const fileStream = fs.createWriteStream(savePath); response.pipe(fileStream); fileStream.on('finish', () => { fileStream.close(); console.log("Unduhan selesai!"); }); } else { console.error(`Unduhan gagal. Server merespons dengan kode: ${response.statusCode}`); } }).on('error', (err) => { console.error("Kesalahan selama unduhan:", err.message); });Python
import requests file_url = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************" save_path = "C:/downloads/myfile.txt" try: response = requests.get(file_url, stream=True) if response.status_code == 200: with open(save_path, 'wb') as f: for chunk in response.iter_content(4096): f.write(chunk) print("Unduhan selesai!") else: print(f"Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: {response.status_code}") except Exception as e: print("Kesalahan selama unduhan:", e)Go
package main import ( "io" "net/http" "os" ) func main() { fileURL := "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************" savePath := "C:/downloads/myfile.txt" response, err := http.Get(fileURL) if err != nil { panic(err) } defer response.Body.Close() if response.StatusCode == http.StatusOK { outFile, err := os.Create(savePath) if err != nil { panic(err) } defer outFile.Close() _, err = io.Copy(outFile, response.Body) if err != nil { panic(err) } println("Unduhan selesai!") } else { println("Tidak ada file untuk diunduh. Server merespons dengan kode HTTP:", response.StatusCode) } }JavaScript
const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; const savePath = "C:/downloads/myfile.txt"; // Tentukan nama objek yang diunduh. fetch(fileURL) .then(response => { if (!response.ok) { throw new Error(`Server merespons dengan kode HTTP: ${response.status}`); } return response.blob(); // Ubah jenis respons menjadi blob. }) .then(blob => { const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download=savePath; // Tentukan nama objek yang diunduh. document.body.appendChild(link); // Langkah ini memastikan bahwa URL yang ditandatangani ada dalam dokumen. link.click(); // Klik URL yang ditandatangani untuk mensimulasikan unduhan objek. link.remove(); // Hapus URL yang ditandatangani setelah objek diunduh. console.log("Unduhan selesai!"); }) .catch(error => { console.error("Kesalahan selama unduhan:", error); });Android-Java
import android.os.AsyncTask; import android.os.Environment; import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class DownloadTask extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { String fileURL = params[0]; String savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myfile.txt"; // Tentukan jalur tempat Anda ingin menyimpan objek yang diunduh. try { URL url = new URL(fileURL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); httpConn.setRequestMethod("GET"); int responseCode = httpConn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = new BufferedInputStream(httpConn.getInputStream()); FileOutputStream outputStream = new FileOutputStream(savePath); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); return "Unduhan selesai!"; } else { return "Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: " + responseCode; } } catch (Exception e) { return "Kesalahan selama unduhan: " + e.getMessage(); } } }Objective-C
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // Tentukan URL yang ditandatangani dan jalur tempat Anda ingin menyimpan objek. NSString *fileURL = @"https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; NSString *savePath = @"/Users/your_username/Desktop/myfile.txt"; // Ganti your_username dengan nama pengguna Anda. // Buat objek URL. NSURL *url = [NSURL URLWithString:fileURL]; // Buat tugas unduhan objek. NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // Tangani kesalahan. if (error) { NSLog(@"Kesalahan selama unduhan: %@", error.localizedDescription); return; } // Periksa data dalam objek. if (!data) { NSLog(@"Tidak ada data yang diterima."); return; } // Simpan objek. NSError *writeError = nil; BOOL success = [data writeToURL:[NSURL fileURLWithPath:savePath] options:NSDataWritingAtomic error:&writeError]; if (success) { NSLog(@"Unduhan selesai!"); } else { NSLog(@"Kesalahan menyimpan file: %@", writeError.localizedDescription); } }]; // Mulai tugas unduhan objek. [task resume]; // Lanjutkan menjalankan thread utama untuk menyelesaikan permintaan asinkron. [[NSRunLoop currentRunLoop] run]; } return 0; }
Skenario Umum
Hasilkan URL yang ditandatangani yang mengizinkan permintaan HTTP GET untuk versi tertentu dari objek
Unduh objek menggunakan URL yang ditandatangani yang berisi header permintaan yang ditentukan
Unduh paksa objek dengan menggunakan URL yang telah ditandatangani
Hasilkan URL yang ditandatangani untuk mengizinkan unduhan objek menggunakan titik akhir kustom
Referensi
Untuk kode contoh lengkap untuk mengunduh objek menggunakan URL yang ditandatangani, lihat presigner_get_object.py.