Anda dapat memanggil operasi PostObject untuk mengunggah objek dari klien web ke Object Storage Service (OSS) dan mengonfigurasi callback unggahan. Dalam hal ini, Anda dapat menggunakan tanda tangan yang dihasilkan di server aplikasi untuk memastikan keamanan objek selama proses unggahan. Anda juga dapat mengonfigurasi kebijakan unggahan untuk memenuhi persyaratan bisnis Anda.
Alur Kerja
Gambar berikut menunjukkan cara menghasilkan tanda tangan di server aplikasi dan mengunggah objek dari klien web ke OSS.
Untuk menambahkan tanda tangan ke permintaan, mengunggah objek ke OSS, dan mengonfigurasi callback unggahan, ikuti langkah-langkah berikut:
Dalam proses ini, digunakan kredensial akses sementara. Ini mencegah pasangan AccessKey dari server aplikasi bocor dan memastikan keamanan objek selama proses unggahan.
Konfigurasikan OSS: Di konsol OSS, buat bucket untuk menyimpan objek yang diunggah. Kemudian, konfigurasikan aturan Berbagi Sumber Daya Lintas Domain (CORS) untuk bucket untuk mengizinkan permintaan lintas domain dari server aplikasi.
Konfigurasikan server aplikasi: Gunakan kredensial akses sementara dan kebijakan unggahan yang telah ditetapkan di server aplikasi untuk menghasilkan tanda tangan dan mengotorisasi pengguna untuk mengunggah objek dalam periode waktu tertentu. Kebijakan unggahan yang telah ditetapkan mencakup informasi seperti nama bucket, jalur direktori, dan waktu kedaluwarsa. Server aplikasi memverifikasi tanda tangan berdasarkan header
authorizationyang disertakan dalam pesan yang dikirim oleh OSS. Jika verifikasi berhasil, server aplikasi mengembalikan pesan berikut dalam format JSON ke OSS:Konfigurasikan klien web: Buat formulir HTML dan gunakan formulir tersebut untuk mengirimkan tanda tangan dan mengunggah objek ke OSS. OSS mengurai konfigurasi callback unggahan dari klien dan mengirimkan permintaan callback POST ke server aplikasi.
Proyek Demo
Untuk informasi tentang proyek demo dalam Java, lihat server-signed-direct-upload-callback-java.zip.
Untuk informasi tentang proyek demo dalam Python, lihat server-signed-direct-upload-callback-python.zip.
Untuk informasi tentang proyek demo dalam Go, lihat server-signed-direct-upload-callback-go.zip.
Untuk informasi tentang proyek demo dalam Node.js, lihat server-signed-direct-upload-callback-nodejs.zip.
Untuk informasi tentang proyek demo dalam PHP, lihat server-signed-direct-upload-callback-php.zip.
Prosedur
Langkah 1: Konfigurasikan OSS
1. Buat Bucket
Buat bucket OSS untuk menyimpan data yang diunggah oleh aplikasi web dari browser.
Masuk ke konsol OSS.
Di panel navigasi sebelah kiri, klik Buckets. Pada halaman Buckets, klik Create Bucket.
Di panel Create Bucket, konfigurasikan parameter berikut. Tabel berikut menjelaskan parameter tersebut.
Parameter
Contoh
Bucket Name
web-direct-upload-callback
Region
Cina (Hangzhou)
Klik Create.
2. Konfigurasikan aturan CORS
Konfigurasikan aturan CORS untuk bucket yang Anda buat.
Pada halaman Buckets, klik nama bucket.
Di pohon navigasi sebelah kiri pada halaman yang muncul, pilih Content Security > CORS. Pada halaman CORS, klik Create Rule.
Di panel Create Rule, konfigurasikan parameter. Tabel berikut menjelaskan parameter tersebut.
Parameter
Contoh
Source
*
Allowed Methods
POST, PUT, dan GET
Allowed Headers
*
Klik OK.
Langkah 2: Konfigurasikan server aplikasi
Dalam penyebaran aktual, jika Anda memiliki server aplikasi sendiri, Anda tidak perlu melakukan operasi di bagian "Persiapan: Buat instance ECS sebagai server aplikasi" dan dialihkan ke 1. Konfigurasikan izin pengguna.
Persiapan: Buat instance ECS sebagai server aplikasi
Operasi 1: Buat instance ECS
Pergi ke tab Custom Launch halaman pembelian instance di konsol Elastic Compute Service (ECS). Kemudian, buat atau pilih sumber daya dasar yang diperlukan oleh instance ECS berdasarkan instruksi berikut.
Pilih wilayah dan metode penagihan
Pilih metode penagihan berdasarkan persyaratan bisnis Anda. Dalam contoh ini, metode penagihan bayar sesuai pemakaian dipilih. Metode penagihan ini memungkinkan Anda melakukan operasi yang lebih fleksibel dibandingkan dengan metode penagihan lainnya.
Pilih wilayah berdasarkan persyaratan latensi jaringan bisnis Anda. Untuk mencapai latensi jaringan rendah dan kecepatan akses tinggi, kami sarankan Anda memilih wilayah yang dekat dengan pengguna Anda. Dalam contoh ini, wilayah Cina (Hangzhou) dipilih.

Buat VPC dan vSwitch
Saat membuat virtual private cloud (VPC), pilih wilayah tempat Anda membuat instance ECS dan rencanakan blok CIDR berdasarkan persyaratan bisnis Anda. Dalam contoh ini, VPC dan vSwitch dibuat di wilayah Cina (Hangzhou). Setelah Anda membuat VPC, kembali ke tab Custom Launch halaman pembelian instance di konsol ECS, segarkan daftar drop-down VPC dan vSwitch, lalu pilih VPC dan vSwitch yang Anda buat.
CatatanAnda juga bisa membuat vSwitch saat membuat VPC.



Pilih jenis instance dan gambar
Pilih jenis instance dan gambar. Versi sistem operasi yang termasuk dalam gambar akan diinstal pada instance saat Anda membuat instance. Dalam contoh ini, jenis instance yang hemat biaya
ecs.e-c1m1.largedan gambar publikAlibaba Cloud Linux 3.2104 LTS 64-bitdipilih.
Pilih penyimpanan
Konfigurasikan disk sistem dan disk data untuk instance ECS berdasarkan persyaratan bisnis Anda. Topik ini menjelaskan cara menyiapkan layanan web sederhana pada instance ECS, yang hanya memerlukan disk sistem untuk menyimpan sistem operasi instance.

Tetapkan alamat IP publik
Untuk memberikan konektivitas Internet ke instance ECS, pilih Tetapkan Alamat IPv4 Publik untuk menetapkan alamat IP publik ke instance. Sebagai alternatif, Anda juga dapat mengaitkan alamat IP elastis (EIP) dengan instance ECS setelah Anda membuat instance. Untuk informasi lebih lanjut, lihat Asosiasikan EIP dengan instance ECS.
CatatanJika Anda tidak menetapkan alamat IP publik atau mengaitkan EIP dengan instance ECS, Anda tidak dapat mengakses instance melalui SSH atau Remote Desktop Protocol (RDP) atau menguji layanan web yang diterapkan pada instance melalui Internet.
Setelah Anda memilih Tetapkan Alamat IPv4 Publik, konfigurasikan parameter Metode Penagihan Bandwidth untuk menentukan metode penagihan untuk penggunaan jaringan. Dalam contoh ini, parameter Metode Penagihan Bandwidth diatur ke Pay-by-traffic. Dalam metode bayar berdasarkan lalu lintas, Anda dikenakan biaya berdasarkan jumlah data yang ditransfer melalui Internet. Untuk informasi lebih lanjut, lihat Bandwidth Publik.

Buat grup keamanan
Buat grup keamanan untuk instance ECS. Grup keamanan berfungsi sebagai firewall virtual yang dapat mengontrol lalu lintas masuk dan keluar untuk instance ECS. Saat membuat grup keamanan, buka port berikut untuk mengizinkan akses ke instance ECS:
Buka Port/Protokol IPv4: pilih SSH (TCP:22), RDP (TCP:3389), HTTP (TCP:80), dan HTTPS (TCP:443).
CatatanDi bagian Open IPv4 Ports/Protocols, pilih port yang harus dibuka untuk aplikasi yang berjalan di instance ECS.
Secara default, aturan yang merujuk 0.0.0.0/0 sebagai alamat sumber dibuat di grup keamanan baru. 0.0.0.0/0 mewakili semua alamat IP. Aturan tersebut mengizinkan akses ke instance ECS dari semua alamat IP pada port yang ditentukan. Setelah Anda membuat instance ECS, kami sarankan Anda memodifikasi aturan untuk mengizinkan akses ke instance hanya dari alamat IP tertentu. Untuk informasi lebih lanjut, lihat Modifikasi aturan grup keamanan.

Buat pasangan kunci
Anda dapat mengikat pasangan kunci ke instance ECS dan menggunakan pasangan kunci sebagai kredensial keamanan untuk mengotentikasi identitas Anda saat masuk ke instance. Setelah Anda membuat pasangan kunci, unduh file kunci privat pasangan kunci untuk digunakan nanti saat Anda terhubung ke instance ECS. Untuk informasi lebih lanjut, lihat Terhubung ke instance ECS. Setelah Anda membuat pasangan kunci, kembali ke tab Custom Launch halaman pembelian instance, segarkan daftar drop-down Pasangan Kunci, lalu pilih pasangan kunci yang Anda buat.
rootadalah akun dengan hak istimewa tertinggi di sistem operasi. Jika Anda memilihrootsebagai nama pengguna masuk, risiko keamanan mungkin timbul. Kami sarankan Anda memilihecs-usersebagai nama pengguna masuk.CatatanSetelah Anda membuat pasangan kunci, file kunci privat pasangan kunci secara otomatis diunduh. Lihat riwayat unduhan browser Anda untuk menemukan file kunci privat dalam format
.pem.
Buat dan lihat instance ECS
Setelah Anda membuat atau memilih sumber daya dasar yang diperlukan, baca dan pilih ECS Terms of Service dan Syarat Dan Ketentuan Produk. Kemudian, klik Create Order. Di pesan Sukses, klik Console untuk melihat instance ECS yang dibuat di halaman Instance. Catat informasi berikut untuk digunakan nanti:
ID Instance: Anda dapat mencari instance ECS berdasarkan ID instance.
Wilayah: Anda dapat mencari instance ECS berdasarkan wilayah.
Alamat IP Publik: Anda dapat menggunakan alamat IP publik instance ECS untuk memeriksa apakah layanan web diterapkan pada instance.


Operasi 2: Terhubung ke instance ECS
Di halaman Instance di ECS console, temukan instance ECS yang Anda buat berdasarkan wilayah dan ID-nya. Lalu, klik Connect di kolom Actions.

Di kotak dialog Remote connection, klik Sign in now di bagian Workbench.

Di kotak dialog Instance Login, atur parameter Authentication ke SSH Key Authentication, atur parameter Nama Pengguna ke
ecs-user, masukkan atau unggah file kunci privat yang Anda unduh saat membuat pasangan kunci, lalu klik OK.CatatanFile kunci privat secara otomatis diunduh ke komputer lokal Anda saat Anda membuat pasangan kunci. Lihat riwayat unduhan browser Anda untuk menemukan file kunci privat dalam format
.pem.
Jika halaman serupa dengan yang ditunjukkan pada gambar berikut muncul, Anda telah masuk ke instance ECS.

1. Konfigurasikan izin pengguna
Untuk mencegah file lokal gagal diunggah karena operasi tidak sah setelah penyebaran selesai, kami sarankan Anda melakukan langkah-langkah berikut untuk membuat pengguna RAM dan memberikan izin yang diperlukan kepada pengguna RAM.
Operasi 1: Buat pengguna RAM di konsol RAM
Buat pengguna RAM dan dapatkan pasangan AccessKey pengguna RAM. Pasangan AccessKey adalah kredensial akses jangka panjang yang diperlukan untuk mengakses dan mengelola server aplikasi.
Masuk ke konsol RAM menggunakan akun Alibaba Cloud atau sebagai administrator akun.
Di panel navigasi sebelah kiri, pilih Identities > Users.
Di halaman Pengguna, klik Create User.
Konfigurasikan parameter Logon Name dan Display Name.
Di bagian Access Mode, pilih Using permanent AccessKey to access dan klik OK.
Anda hanya bisa mendapatkan rahasia AccessKey pengguna RAM saat Anda membuat pengguna RAM. Anda harus menjaga kerahasiaan rahasia AccessKey untuk mencegah kebocoran kredensial.
Klik Copy di kolom Actions pada halaman yang muncul untuk menyalin dan menempelkan pasangan AccessKey ke file yang disimpan dengan aman.
Operasi 2: Berikan izin kepada pengguna RAM untuk memanggil operasi AssumeRole di konsol RAM
Berikan izin kepada pengguna RAM untuk memanggil operasi AssumeRole. Dengan cara ini, pengguna RAM dapat memperoleh kredensial akses sementara dengan mengasumsikan peran RAM.
Di panel navigasi sebelah kiri, pilih Identities > Users.
Di halaman Users, temukan pengguna RAM yang ingin Anda beri izin dan klik Add Permissions di kolom Tindakan.
Di bagian Kebijakan pada panel Grant Permission, pilih kebijakan sistem AliyunSTSAssumeRoleAccess.
CatatanKebijakan AliyunSTSAssumeRoleAccess mengizinkan pengguna RAM untuk memanggil operasi AssumeRole. Izin kebijakan tersebut independen dari izin yang diperlukan untuk pengguna RAM untuk mendapatkan kredensial akses sementara dari STS dan memulai permintaan ke OSS.
Klik Grant permissions.
Operasi 3: Buat peran RAM di konsol RAM
Buat peran RAM untuk akun Alibaba Cloud dan dapatkan Nama Sumber Daya Alibaba Cloud (ARN) peran RAM. Peran RAM diasumsikan oleh pengguna RAM nantinya.
Di panel navigasi sebelah kiri, pilih Identities > Roles.
Di halaman Peran, klik Create Role. Di langkah Pilih Jenis Peran wizard Buat Peran, atur parameter Pilih Entitas Tepercaya ke Alibaba Cloud Account dan klik Next.
Di langkah Konfigurasikan Peran wizard Buat Peran, masukkan nama di bidang RAM Role Name dan atur parameter Pilih Akun Alibaba Cloud Tepercaya ke Current Alibaba Cloud Account.
Klik OK. Setelah Anda membuat peran, klik Close.
Di halaman Peran, masukkan nama peran di kotak pencarian. Contoh:
oss-web-upload. Klik nama peran tersebut.Di bagian Informasi Dasar, klik Copy di sebelah bidang ARN untuk mencatat ARN peran RAM.
Operasi 4: Buat kebijakan kustom di konsol RAM
Buat kebijakan kustom berdasarkan prinsip hak istimewa minimal untuk memberikan izin kepada peran RAM untuk mengunggah data hanya ke bucket tertentu.
Di panel navigasi sebelah kiri, pilih Permissions > Policies.
Di halaman Kebijakan, klik Create Policy.
Di halaman Create Policy, klik JSON. Salin skrip contoh berikut dan tempelkan ke editor kode. Ganti
<BucketName>dengan nama bucket yang Anda buat, yaituweb-direct-upload.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:<BucketName>/*" } ] }Setelah Anda mengonfigurasi kebijakan, klik Next to edit policy information.
Di bagian Basic Information, tentukan nama kebijakan dan klik OK.
Operasi 5: Lampirkan kebijakan kustom ke peran RAM di konsol RAM
Lampirkan kebijakan kustom ke peran RAM. Dengan cara ini, peran RAM memiliki izin yang diperlukan saat peran RAM diasumsikan.
Di panel navigasi sebelah kiri, pilih Identities > Roles.
Di halaman Roles, temukan peran RAM dan klik Grant Permission di kolom Tindakan.
Di bagian Kebijakan pada panel Grant Permission, pilih Custom Policy dari daftar drop-down, lalu pilih kebijakan kustom.
Klik Grant permissions.
2. Dapatkan kredensial akses sementara dan hitung tanda tangan di server aplikasi
Untuk mencegah risiko yang disebabkan oleh secara eksplisit menentukan informasi sensitif seperti accessKeyId, accessKeySecret, dan roleArn di dalam kode, kami sarankan Anda mengonfigurasi informasi sensitif tersebut di variabel lingkungan.
Anda dapat menambahkan variabel lingkungan sebagai variabel lingkungan sementara dan menggunakannya hanya di sesi saat ini.
Linux
Jalankan perintah berikut:
export OSS_ACCESS_KEY_ID="your-access-key-id" export OSS_ACCESS_KEY_SECRET="your-access-key-secret" export OSS_STS_ROLE_ARN="your-role-arn"Jalankan perintah berikut untuk memeriksa apakah variabel lingkungan berlaku:
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET echo $OSS_STS_ROLE_ARN
macOS
Jalankan perintah berikut:
export OSS_ACCESS_KEY_ID="your-access-key-id" export OSS_ACCESS_KEY_SECRET="your-access-key-secret" export OSS_STS_ROLE_ARN="your-role-arn"Jalankan perintah berikut untuk memeriksa apakah variabel lingkungan berlaku:
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET echo $OSS_STS_ROLE_ARN
Windows
Jalankan perintah berikut di cmd:
set OSS_ACCESS_KEY_ID "your-access-key-id" set OSS_ACCESS_KEY_SECRET "your-access-key-secret" set OSS_STS_ROLE_ARN "your-role-arn"Buka jendela baru.
Jalankan perintah berikut untuk memeriksa apakah variabel lingkungan berlaku di jendela baru:
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET echo $OSS_STS_ROLE_ARN
Contoh kode berikut memberikan contoh tentang cara menghitung tanda tangan V4 di permintaan PostObject di server. Untuk informasi lebih lanjut, lihat (Direkomendasikan) Sertakan tanda tangan V4 di permintaan PostObject. Untuk informasi tentang konfigurasi bidang formulir kebijakan di permintaan PostObject, lihat kebijakan.
Java
Tambahkan dependensi berikut ke proyek Maven:
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.4</version>
</dependency>
<dependency>
<groupId>com.aliyun.kms</groupId>
<artifactId>kms-transfer-client</artifactId>
<version>0.1.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.6</version>
</dependency>Contoh kode berikut memberikan contoh tentang cara mendapatkan kredensial akses sementara, menghitung tanda tangan yang dapat Anda gunakan untuk mengunggah objek, dan mengonfigurasi callback unggahan:
package com.aliyun.oss.web;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.tea.TeaException;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.codec.binary.Base64;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
@Controller
public class WebController {
// Tentukan informasi dasar. Ganti nilai-nilai dengan nama bucket aktual, ID wilayah, dan titik akhir host.
String bucket = "examplebucket";
String region = "cn-hangzhou";
String host = "http://examplebucket.oss-cn-hangzhou.aliyuncs.com";
// Tentukan URL server aplikasi tempat permintaan callback unggahan dikirim. URL tersebut harus berupa domain publik. URL ini digunakan untuk komunikasi antara server aplikasi dan OSS. Setelah Anda mengunggah objek, OSS menggunakan URL tersebut untuk mengirim informasi unggahan ke server aplikasi.
String callbackUrl = "http://oss-demo.aliyuncs.com:23450/callback"; // Tentukan alamat server callback yang menerima permintaan callback. Contoh: http://oss-demo.aliyuncs.com:23450/callback.
// Tentukan awalan yang terkandung dalam nama objek yang ingin Anda unggah ke OSS.
String upload_dir = "dir";
// Tentukan periode validitas kredensial akses sementara. Satuan: detik.
Long expire_time = 3600L;
/**
* Waktu kedaluwarsa dihitung berdasarkan periode validitas yang ditentukan. Satuan: detik.
* @param seconds: periode validitas, dalam detik.
* @return: string waktu dalam standar ISO 8601. Contoh: 2014-12-01T12:00:00.000Z.
*/
public static String generateExpiration(long seconds) {
// Dapatkan timestamp saat ini. Satuan: detik.
long now = Instant.now().getEpochSecond();
// Hitung timestamp waktu kedaluwarsa.
long expirationTime = now + seconds;
// Ubah timestamp menjadi objek instan dan format dalam standar ISO 8601.
Instant instant = Instant.ofEpochSecond(expirationTime);
// Tentukan zona waktu.
ZoneId zone = ZoneId.systemDefault(); // Tentukan bahwa zona waktu default sistem digunakan.
// Ubah objek instan menjadi objek ZonedDateTime.
ZonedDateTime zonedDateTime = instant.atZone(zone);
// Tentukan format waktu. Contoh: 2023-12-03T13:00:00.000Z.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
// Format waktu.
String formattedDate = zonedDateTime.format(formatter);
// Keluarkan hasilnya.
return formattedDate;
}
// Inisialisasi instance STSClient.
public static com.aliyun.sts20150401.Client createStsClient() throws Exception {
// Jika kode proyek bocor, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya dalam akun Anda mungkin terganggu. Contoh kode sampel berikut hanya disediakan untuk referensi.
// Kami sarankan Anda menggunakan kredensial akses yang diperoleh dari STS, yang memberikan keamanan lebih tinggi.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// Diperlukan. Pastikan variabel lingkungan OSS_ACCESS_KEY_ID dikonfigurasi.
.setAccessKeyId(System.getenv("OSS_ACCESS_KEY_ID"))
// Diperlukan. Pastikan variabel lingkungan OSS_ACCESS_KEY_SECRET dikonfigurasi.
.setAccessKeySecret(System.getenv("OSS_ACCESS_KEY_SECRET"));
// Tentukan titik akhir wilayah tempat bucket berada. Untuk informasi lebih lanjut, kunjungi https://api.aliyun.com/product/Sts.
config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
return new com.aliyun.sts20150401.Client(config);
}
// Dapatkan token keamanan dari STS.
public static AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials getCredential() throws Exception {
com.aliyun.sts20150401.Client client = WebController.createStsClient();
com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest()
// Diperlukan. Pastikan variabel lingkungan OSS_STS_ROLE_ARN dikonfigurasi.
.setRoleArn(System.getenv("OSS_STS_ROLE_ARN"))
.setRoleSessionName("yourRoleSessionName");// Tentukan nama sesi kustom.
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// Tulis kode Anda sendiri untuk menampilkan respons operasi API jika diperlukan.
AssumeRoleResponse response = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
// ID AccessKey, Rahasia AccessKey, dan token keamanan yang diperlukan untuk operasi selanjutnya termasuk dalam kredensial akses.
return response.body.credentials;
} catch (TeaException error) {
// Tangani pengecualian dengan hati-hati dalam skenario bisnis aktual dan jangan abaikan pengecualian dalam proyek Anda. Dalam contoh ini, pengecualian disediakan hanya untuk referensi.
// Tampilkan pesan kesalahan.
System.out.println(error.getMessage());
// Tampilkan informasi pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Tangani pengecualian dengan hati-hati dalam skenario bisnis aktual dan jangan abaikan pengecualian dalam proyek Anda. Dalam contoh ini, pengecualian disediakan hanya untuk referensi.
// Tampilkan pesan kesalahan.
System.out.println(error.getMessage());
// Tampilkan informasi pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return null;
}
@GetMapping("/get_post_signature_for_oss_upload")
public ResponseEntity<Map<String, String>> getPostSignatureForOssUpload() throws Exception {
AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials sts_data = getCredential();
String accesskeyid = sts_data.accessKeyId;
String accesskeysecret = sts_data.accessKeySecret;
String securitytoken = sts_data.securityToken;
// Dapatkan tanggal saat ini di header x-oss-credential. Nilainya dalam format yyyyMMdd.
LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String date = today.format(formatter);
// Dapatkan header x-oss-date.
ZonedDateTime now = ZonedDateTime.now().withZoneSameInstant(java.time.ZoneOffset.UTC);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'");
String x_oss_date = now.format(formatter2);
// Langkah 1: Buat kebijakan.
String x_oss_credential = accesskeyid + "/" + date + "/" + region + "/oss/aliyun_v4_request";
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> policy = new HashMap<>();
policy.put("expiration", generateExpiration(expire_time));
List<Object> conditions = new ArrayList<>();
Map<String, String> bucketCondition = new HashMap<>();
bucketCondition.put("bucket", bucket);
conditions.add(bucketCondition);
Map<String, String> securityTokenCondition = new HashMap<>();
securityTokenCondition.put("x-oss-security-token", securitytoken);
conditions.add(securityTokenCondition);
Map<String, String> signatureVersionCondition = new HashMap<>();
signatureVersionCondition.put("x-oss-signature-version", "OSS4-HMAC-SHA256");
conditions.add(signatureVersionCondition);
Map<String, String> credentialCondition = new HashMap<>();
credentialCondition.put("x-oss-credential", x_oss_credential); // Ganti nilainya dengan ID AccessKey Anda.
conditions.add(credentialCondition);
Map<String, String> dateCondition = new HashMap<>();
dateCondition.put("x-oss-date", x_oss_date);
conditions.add(dateCondition);
conditions.add(Arrays.asList("content-length-range", 1, 10240000));
conditions.add(Arrays.asList("eq", "$success_action_status", "200"));
conditions.add(Arrays.asList("starts-with", "$key", upload_dir));
policy.put("conditions", conditions);
String jsonPolicy = mapper.writeValueAsString(policy);
// Langkah 2: Buat string untuk ditandatangani.
String stringToSign = new String(Base64.encodeBase64(jsonPolicy.getBytes()));
// Langkah 3: Hitung kunci penandatanganan.
byte[] dateKey = hmacsha256(("aliyun_v4" + accesskeysecret).getBytes(), date);
byte[] dateRegionKey = hmacsha256(dateKey, region);
byte[] dateRegionServiceKey = hmacsha256(dateRegionKey, "oss");
byte[] signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request");
// Langkah 4: Hitung tanda tangan.
byte[] result = hmacsha256(signingKey, stringToSign);
String signature = BinaryUtil.toHex(result);
// Langkah 5: Konfigurasikan callback.
JSONObject jasonCallback = new JSONObject();
jasonCallback.put("callbackUrl", callbackUrl);
jasonCallback.put("callbackBody","filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
jasonCallback.put("callbackBodyType", "application/x-www-form-urlencoded");
String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
Map<String, String> response = new HashMap<>();
// Tambahkan data ke pemetaan respons.
response.put("version", "OSS4-HMAC-SHA256");
// Konfigurasi ini rentan terhadap kesalahan. Anda harus melakukan pengkodean Base64 sebelum mengunggah kebijakan.
response.put("policy", stringToSign);
response.put("x_oss_credential", x_oss_credential);
response.put("x_oss_date", x_oss_date);
response.put("signature", signature);
response.put("security_token", securitytoken);
response.put("dir", upload_dir);
response.put("host", host);
response.put("callback", base64CallbackBody);
// Kembalikan kelas ResponseEntity yang mencakup kode status 200 OK ke klien web. Kemudian, klien dapat melakukan operasi PostObject.
return ResponseEntity.ok(response);
}
public static byte[] hmacsha256(byte[] key, String data) {
try {
// Inisialisasi spesifikasi kunci HMAC, atur algoritma ke HMAC-SHA256, dan gunakan kunci yang disediakan.
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "HmacSHA256");
// Dapatkan instance Mac dan gunakan metode getInstance untuk mengatur algoritma ke HMAC-SHA256.
Mac mac = Mac.getInstance("HmacSHA256");
// Gunakan kunci untuk menginisialisasi instance Mac.
mac.init(secretKeySpec);
// Hitung nilai HMAC. Gunakan metode doFinal untuk menerima data yang akan dihitung dan mengembalikan hasil perhitungan dalam array.
byte[] hmacBytes = mac.doFinal(data.getBytes());
return hmacBytes;
} catch (Exception e) {
throw new RuntimeException("Gagal menghitung HMAC-SHA256", e);
}
}
}Python
Jalankan perintah berikut untuk menginstal dependensi:
pip install flask
pip install alibabacloud_tea_openapi alibabacloud_sts20150401 alibabacloud_credentialsContoh kode berikut memberikan contoh tentang cara mendapatkan kredensial akses sementara dari STS, menghitung tanda tangan yang dapat Anda gunakan untuk mengunggah objek, dan mengonfigurasi callback unggahan:
from flask import Flask, render_template, jsonify, request
from alibabacloud_tea_openapi.models import Config
from alibabacloud_sts20150401.client import Client as Sts20150401Client
from alibabacloud_sts20150401 import models as sts_20150401_models
import os
import json
import base64
import hmac
import datetime
import time
import hashlib
import oss2
app = Flask(__name__)
# Konfigurasikan variabel lingkungan OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_STS_ROLE_ARN.
access_key_id = os.environ.get('OSS_ACCESS_KEY_ID')
access_key_secret = os.environ.get('OSS_ACCESS_KEY_SECRET')
role_arn_for_oss_upload = os.environ.get('OSS_STS_ROLE_ARN')
# Tentukan nama sesi.
role_session_name = 'yourRoleSessionName'
# Ganti nilai-nilai dengan nama bucket aktual, ID wilayah, dan titik akhir host.
bucket = ' examplebucket'
region_id = 'cn-hangzhou'
host = 'http://examplebucket.oss-cn-hangzhou.aliyuncs.com'
# Tentukan periode validitas kredensial akses sementara. Satuan: detik.
expire_time = 3600
# Tentukan awalan dalam nama objek di OSS.
upload_dir = 'dir'
def hmacsha256(key, data):
"""
Tentukan fungsi yang digunakan untuk menghitung nilai HMAC-SHA256.
:param key: Kunci yang digunakan untuk menghitung nilai hash. Kunci tersebut bertipe byte.
:param data: Data yang ingin Anda hitung nilai hash-nya. Data tersebut bertipe string.
:return: Nilai HMAC-SHA256 yang dihitung. Nilai tersebut bertipe byte.
"""
try:
mac = hmac.new(key, data.encode(), hashlib.sha256)
hmacBytes = mac.digest()
return hmacBytes
except Exception as e:
raise RuntimeError(f"Gagal menghitung HMAC-SHA256 karena {e}")
@app.route("/")
def hello_world():
return render_template('index.html')
@app.route('/get_post_signature_for_oss_upload', methods=['GET'])
def generate_upload_params():
# Inisialisasi konfigurasi dan lewatkan kredensial.
config = Config(
region_id=region_id,
access_key_id=access_key_id,
access_key_secret=access_key_secret
)
# Buat instance STSClient dan dapatkan kredensial akses sementara.
sts_client = Sts20150401Client(config=config)
assume_role_request = sts_20150401_models.AssumeRoleRequest(
role_arn=role_arn_for_oss_upload,
role_session_name=role_session_name
)
response = sts_client.assume_role(assume_role_request)
token_data = response.body.credentials.to_map()
# Gunakan kredensial akses sementara yang dikembalikan oleh STS.
temp_access_key_id = token_data['AccessKeyId']
temp_access_key_secret = token_data['AccessKeySecret']
security_token = token_data['SecurityToken']
now = int(time.time())
# Ubah timestamp menjadi objek datetime.
dt_obj = datetime.datetime.utcfromtimestamp(now)
# Atur waktu kedaluwarsa permintaan menjadi 3 jam setelah waktu saat ini.
dt_obj_plus_3h = dt_obj + datetime.timedelta(hours=3)
# Tentukan waktu permintaan.
dt_obj_1 = dt_obj.strftime('%Y%m%dT%H%M%S') + 'Z'
# Tentukan tanggal permintaan.
dt_obj_2 = dt_obj.strftime('%Y%m%d')
# Tentukan waktu kedaluwarsa permintaan.
expiration_time = dt_obj_plus_3h.strftime('%Y-%m-%dT%H:%M:%S.000Z')
# Tentukan fungsi yang digunakan untuk mengkodekan parameter callback dalam Base64.
def encode_callback(callback_params):
cb_str = json.dumps(callback_params).strip()
return oss2.compat.to_string(base64.b64encode(oss2.compat.to_bytes(cb_str)))
# Buat konfigurasi callback dan kodekan dalam Base64.
callback_config = {
"callbackUrl": "http://oss-demo.aliyuncs.com:23450/callback", # Tentukan alamat server callback lokal.
"callbackBody": "bucket=${bucket}&object=${object}&etag=${etag}&size=${size}",
"callbackBodyType": "application/x-www-form-urlencoded"
}
encoded_callback = encode_callback(callback_config)
# Buat kebijakan dan hasilkan tanda tangan.
policy = {
"expiration": expiration_time,
"conditions": [
["eq", "$success_action_status", "200"],
{"x-oss-signature-version": "OSS4-HMAC-SHA256"},
{"x-oss-credential": f"{temp_access_key_id}/{dt_obj_2}/cn-hangzhou/oss/aliyun_v4_request"},
{"x-oss-security-token": security_token},
{"x-oss-date": dt_obj_1},
]
}
policy_str = json.dumps(policy).strip()
# Langkah 2: Buat string untuk ditandatangani.
stringToSign = base64.b64encode(policy_str.encode()).decode()
# Langkah 3: Hitung kunci penandatanganan.
dateKey = hmacsha256(("aliyun_v4" + temp_access_key_secret).encode(), dt_obj_2)
dateRegionKey = hmacsha256(dateKey, "cn-hangzhou")
dateRegionServiceKey = hmacsha256(dateRegionKey, "oss")
signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request")
# Langkah 4: Hitung tanda tangan.
result = hmacsha256(signingKey, stringToSign)
signature = result.hex()
# Kembalikan data.
response_data = {
'policy': stringToSign, # Bidang formulir.
'x_oss_signature_version': "OSS4-HMAC-SHA256", # Versi tanda tangan dan algoritma yang digunakan untuk menghitung tanda tangan. Atur nilainya ke OSS4-HMAC-SHA256.
'x_oss_credential': f"{temp_access_key_id}/{dt_obj_2}/cn-hangzhou/oss/aliyun_v4_request", # Set parameter yang digunakan untuk menentukan informasi tentang kunci turunan.
'x_oss_date': dt_obj_1, # Waktu permintaan.
'signature': signature, # Deskripsi tanda tangan.
'host': host,
'dir': upload_dir,
'security_token': security_token, # Token keamanan.
'callback': encoded_callback # Kembalikan konfigurasi callback yang dikodekan dalam Base64.
}
return jsonify(response_data)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)Parameter Callback adalah string yang dikodekan dalam Base64 yang berisi beberapa bidang dalam format JSON. Untuk membuat parameter callback, Anda harus menentukan URL (callbackUrl) server tempat permintaan callback dikirim dan konten (callbackBody) dari permintaan callback.
{"callbackUrl":"http://oss-demo.aliyuncs.com:23450",
"callbackBody":"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
"callbackBodyType":"application/x-www-form-urlencoded"}Parameter | Deskripsi |
callbackUrl | URL server aplikasi tempat OSS mengirim permintaan. |
callbackBody | Konten yang dikirim OSS ke server aplikasi. Jika Anda mengunggah objek non-gambar, kontennya bisa berupa nama objek, ukuran, dan tipe. Jika Anda mengunggah gambar, kontennya bisa berupa tinggi dan lebar gambar. |
callbackBodyType | Tipe konten permintaan. Nilai yang valid:
|
Metode callback yang digunakan dalam contoh sebelumnya hanya disediakan untuk referensi. Anda dapat mengonfigurasi metode callback dengan memodifikasi kode server. Untuk informasi lebih lanjut, lihat Callback.
Go
Jalankan perintah berikut untuk menginstal dependensi:
go get -u github.com/aliyun/credentials-go
go mod tidyContoh kode berikut memberikan contoh tentang cara mendapatkan kredensial akses sementara dari STS, menghitung tanda tangan yang dapat Anda gunakan untuk mengunggah objek, dan mengonfigurasi callback unggahan:
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"hash"
"log"
"net/http"
"os"
"time"
"github.com/aliyun/credentials-go/credentials"
)
// Tentukan variabel global.
var (
region string
bucketName string
product = "oss"
)
// Gunakan struktur PolicyToken untuk menyimpan data formulir yang dihasilkan.
type PolicyToken struct {
Policy string `json:"policy"`
SecurityToken string `json:"security_token"`
SignatureVersion string `json:"x_oss_signature_version"`
Credential string `json:"x_oss_credential"`
Date string `json:"x_oss_date"`
Signature string `json:"signature"`
Host string `json:"host"`
Dir string `json:"dir"`
Callback string `json:"callback"`
}
type CallbackParam struct{
CallbackUrl string `json:"callbackUrl"`
CallbackBody string `json:"callbackBody"`
CallbackBodyType string `json:"callbackBodyType"`
}
func main() {
// Tentukan string IP dan port default.
strIPPort := ":8080"
if len(os.Args) == 3 {
strIPPort = fmt.Sprintf("%s:%s", os.Args[1], os.Args[2])
} else if len(os.Args) != 1 {
fmt.Println("Usage : go run test1.go ")
fmt.Println("Usage : go run test1.go ip port ")
fmt.Println("Example : go run test1.go 11.22.**.** 80 ")
fmt.Println("Example : go run test1.go 0.0.0.0 8080 ")
fmt.Println("")
os.Exit(0)
}
// Tampilkan alamat IP dan port server.
fmt.Printf("server is running on %s \n", strIPPort)
// Daftarkan fungsi yang memproses permintaan jalur root.
http.HandleFunc("/", handlerRequest)
// Daftarkan fungsi yang memproses permintaan yang dimulai untuk mendapatkan tanda tangan.
http.HandleFunc("/get_post_signature_for_oss_upload", handleGetPostSignature)
// Mulai server HTTP.
err := http.ListenAndServe(strIPPort, nil)
if err != nil {
strError := fmt.Sprintf("http.ListenAndServe failed : %s \n", err.Error())
panic(strError)
}
}
// Gunakan fungsi handlerRequest untuk memproses permintaan jalur root.
func handlerRequest(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
http.ServeFile(w, r, "templates/index.html")
return
}
http.NotFound(w, r)
}
// Gunakan fungsi handleGetPostSignature untuk memproses permintaan yang dimulai untuk mendapatkan tanda tangan.
func handleGetPostSignature(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
response := getPolicyToken()
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Access-Control-Allow-Origin", "*") // Izinkan permintaan lintas domain.
w.Write([]byte(response))
return
}
http.NotFound(w, r)
}
// Gunakan fungsi getPolicyToken untuk menghasilkan tanda tangan dan kredensial akses yang diperlukan untuk mengunggah objek.
func getPolicyToken() string {
// Tentukan wilayah tempat bucket berada.
region = "cn-hangzhou"
// Tentukan nama bucket.
bucketName = "examplebucket"
// Tentukan bucket tempat Anda ingin mengunggah objek.
host := fmt.Sprintf("https://%s.oss-%s.aliyuncs.com", bucketName, region)
// Tentukan direktori tempat Anda ingin mengunggah objek.
dir := "user-dir"
// Tentukan URL server tempat permintaan callback unggahan dikirim. Ganti alamat IP dan nomor port dengan nilai aktual.
callbackUrl := "http://oss-demo.aliyuncs.com:23450/callback";
config := new(credentials.Config).
SetType("ram_role_arn").
SetAccessKeyId(os.Getenv("OSS_ACCESS_KEY_ID")).
SetAccessKeySecret(os.Getenv("OSS_ACCESS_KEY_SECRET")).
SetRoleArn(os.Getenv("OSS_STS_ROLE_ARN")).
SetRoleSessionName("Role_Session_Name").
SetPolicy("").
SetRoleSessionExpiration(3600)
// Buat penyedia kredensial berdasarkan konfigurasi.
provider, err := credentials.NewCredential(config)
if err != nil {
log.Fatalf("NewCredential fail, err:%v", err)
}
// Dapatkan kredensial akses dari penyedia kredensial.
cred, err := provider.GetCredential()
if err != nil {
log.Fatalf("GetCredential fail, err:%v", err)
}
// Buat kebijakan.
utcTime := time.Now().UTC()
date := utcTime.Format("20060102")
expiration := utcTime.Add(1 * time.Hour)
policyMap := map[string]any{
"expiration": expiration.Format("2006-01-02T15:04:05.000Z"),
"conditions": []any{
map[string]string{"bucket": bucketName},
map[string]string{"x-oss-signature-version": "OSS4-HMAC-SHA256"},
map[string]string{"x-oss-credential": fmt.Sprintf("%v/%v/%v/%v/aliyun_v4_request", *cred.AccessKeyId, date, region, product)},
map[string]string{"x-oss-date": utcTime.Format("20060102T150405Z")},
map[string]string{"x-oss-security-token": *cred.SecurityToken},
},
}
// Ubah format kebijakan menjadi JSON.
policy, err := json.Marshal(policyMap)
if err != nil {
log.Fatalf("json.Marshal fail, err:%v", err)
}
// Buat string-to-sign.
stringToSign := base64.StdEncoding.EncodeToString([]byte(policy))
hmacHash := func() hash.Hash { return sha256.New() }
// Buat kunci penandatanganan.
signingKey := "aliyun_v4" + *cred.AccessKeySecret
h1 := hmac.New(hmacHash, []byte(signingKey))
io.WriteString(h1, date)
h1Key := h1.Sum(nil)
h2 := hmac.New(hmacHash, h1Key)
io.WriteString(h2, region)
h2Key := h2.Sum(nil)
h3 := hmac.New(hmacHash, h2Key)
io.WriteString(h3, product)
h3Key := h3.Sum(nil)
h4 := hmac.New(hmacHash, h3Key)
io.WriteString(h4, "aliyun_v4_request")
h4Key := h4.Sum(nil)
// Hasilkan tanda tangan.
h := hmac.New(hmacHash, h4Key)
io.WriteString(h, stringToSign)
signature := hex.EncodeToString(h.Sum(nil))
var callbackParam CallbackParam
callbackParam.CallbackUrl = callbackUrl
callbackParam.CallbackBody = "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}"
callbackParam.CallbackBodyType = "application/x-www-form-urlencoded"
callback_str,err:=json.Marshal(callbackParam)
if err != nil {
fmt.Println("callback json err:", err)
}
callbackBase64 := base64.StdEncoding.EncodeToString(callback_str)
// Buat formulir yang digunakan untuk mengembalikan data ke frontend.
policyToken := PolicyToken{
Policy: stringToSign,
SecurityToken: *cred.SecurityToken,
SignatureVersion: "OSS4-HMAC-SHA256",
Credential: fmt.Sprintf("%v/%v/%v/%v/aliyun_v4_request", *cred.AccessKeyId, date, region, product),
Date: utcTime.UTC().Format("20060102T150405Z"),
Signature: signature,
Host: host, // Kembalikan bucket tempat objek diunggah.
Dir: dir, // Kembalikan direktori tempat objek diunggah.
Callback: callbackBase64, // Kembalikan parameter callback unggahan.
}
response, err := json.Marshal(policyToken)
if err != nil {
fmt.Println("json err:", err)
}
return string(response)
}Node.js
Jalankan perintah berikut untuk menginstal dependensi:
npm install ali-oss
npm install @alicloud/credentials
npm install expressContoh kode berikut memberikan contoh tentang cara mendapatkan kredensial akses sementara dari STS, menghitung tanda tangan yang dapat Anda gunakan untuk mengunggah objek, dan mengonfigurasi callback unggahan:
const express = require('express');
const OSS = require('ali-oss');
const { STS } = require('ali-oss');
const { getCredential } = require('ali-oss/lib/common/signUtils');
const { getStandardRegion } = require('ali-oss/lib/common/utils/getStandardRegion');
const { policy2Str } = require('ali-oss/lib/common/utils/policy2Str');
const app = express();
const PORT=process.env.PORT | | 8000; // Tentukan nomor port.
// Tentukan direktori tempat file statis disimpan.
app.use(express.static('templates'));
const GenerateSignature = async () => {
// Inisialisasi instance STSClient.
let sts = new STS({
accessKeyId: process.env.OSS_ACCESS_KEY_ID, // Dapatkan ID AccessKey pengguna RAM dari variabel lingkungan.
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET // Dapatkan rahasia AccessKey pengguna RAM dari variabel lingkungan.
});
// Panggil operasi assumeRole untuk mendapatkan kredensial akses sementara dari STS.
const result=await sts.assumeRole(process.env.OSS_STS_ROLE_ARN, ', '3600', 'yourRoleSessionName'); // Dapatkan ARN peran RAM dari variabel lingkungan, atur periode validitas kredensial akses sementara menjadi 3600 detik, dan atur nama sesi peran menjadi yourRoleSessionName.
// Ekstrak nilai parameter AccessKeyId, AccessKeySecret, dan SecurityToken dari kredensial akses sementara.
const accessKeyId = result.credentials.AccessKeyId;
const accessKeySecret = result.credentials.AccessKeySecret;
const securityToken = result.credentials.SecurityToken;
// Inisialisasi instance OSSClient.
const client = new OSS({
bucket: 'examplebucket', // Ganti examplebucket dengan nama bucket aktual.
region: 'region cn-hangzhou, // Ganti cn-hangzhou dengan wilayah tempat bucket berada.
accessKeyId,
accessKeySecret,
stsToken: securityToken,
refreshSTSTokenInterval: 0,
refreshSTSToken: async () => {
const { accessKeyId, accessKeySecret, securityToken } = await client.getCredential();
return { accessKeyId, accessKeySecret, stsToken: securityToken };
},
});
// Buat peta data formulir.
const formData = new Map();
// Atur waktu kedaluwarsa tanda tangan menjadi 10 menit setelah waktu saat ini.
const date = new Date();
const expirationDate = new Date(date);
expirationDate.setMinutes(date.getMinutes() + 10);
// Format tanggal menjadi string waktu UTC yang sesuai dengan standar ISO 8601.
function padTo2Digits(num) {
return num.toString().padStart(2, '0');
}
function formatDateToUTC(date) {
return (
date.getUTCFullYear() +
padTo2Digits(date.getUTCMonth() + 1) +
padTo2Digits(date.getUTCDate()) +
'T' +
padTo2Digits(date.getUTCHours()) +
padTo2Digits(date.getUTCMinutes()) +
padTo2Digits(date.getUTCSeconds()) +
'Z'
);
}
const formattedDate = formatDateToUTC(expirationDate);
// Tentukan URL server aplikasi tempat permintaan callback unggahan dikirim. URL ini digunakan untuk komunikasi antara server aplikasi dan OSS. Setelah Anda mengunggah objek, OSS menggunakan URL tersebut untuk mengirim informasi unggahan ke server aplikasi. Sebagai contoh, Anda dapat mengatur callbackUrl ke https://oss-demo.aliyuncs.com:23450.
// Hasilkan x-oss-credential dan tentukan data formulir.
const credential = getCredential(formattedDate.split('T')[0], getStandardRegion(client.options.region), client.options.accessKeyId);
formData.set('x_oss_date', formattedDate);
formData.set('x_oss_credential', credential);
formData.set('x_oss_signature_version', 'OSS4-HMAC-SHA256');
// Buat kebijakan.
// Di bidang formulir kebijakan berikut, hanya bidang yang diperlukan yang ditentukan.
const policy = {
expiration: expirationDate.toISOString(),
conditions: [
{ 'bucket': 'examplebucket' }, // Ganti examplebucket dengan nama bucket aktual.
{ 'x-oss-credential': credential },
{ 'x-oss-signature-version': 'OSS4-HMAC-SHA256' },
{ 'x-oss-date': formattedDate },
],
};
// Jika token keamanan ada, tambahkan ke kebijakan dan data formulir.
if (client.options.stsToken) {
policy.conditions.push({ 'x-oss-security-token': client.options.stsToken });
formData.set('security_token', client.options.stsToken);
}
// Hasilkan tanda tangan dan tentukan data formulir.
const signature = client.signPostObjectPolicyV4(policy, date);
formData.set('policy', Buffer.from(policy2Str(policy), 'utf8').toString('base64'));
formData.set('signature', signature);
const callback = {
callbackUrl: 'http://oss-demo.aliyuncs.com:23450/callback',// Tentukan alamat server callback yang menerima permintaan callback. Contoh: http://oss-demo.aliyuncs.com:23450/callback.
callbackBody:// Tentukan konten yang ingin Anda masukkan dalam permintaan callback seperti ETag dan mimeType objek yang diunggah.
"filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
callbackBodyType: "application/x-www-form-urlencoded",// Tentukan tipe konten callback.
};
// Kembalikan data dalam formulir.
return {
host: `http://${client.options.bucket}.oss-${client.options.region}.aliyuncs.com`,
policy: Buffer.from(policy2Str(policy), 'utf8').toString('base64'),
x_oss_signature_version: 'OSS4-HMAC-SHA256',
x_oss_credential: credential,
x_oss_date: formattedDate,
signature: signature,
dir: 'user-dir', // Tentukan awalan dalam nama objek yang ingin Anda unggah ke OSS.
callback: Buffer.from(JSON.stringify(callback)).toString("base64"),// JSON yang dikodekan menggunakan Base64 dengan Buffer.from.
security_token: client.options.stsToken
};
};
app.get('/get_post_signature_for_oss_upload', async (req, res) => {
try {
const result = await GenerateSignature();
res.json(result); // Kembalikan data tanda tangan yang dihasilkan.
} catch (error) {
console.error('Error generating signature:', error);
res.status(500).send('Error generating signature');
}
});
app.listen(PORT, () => {
console.log(`Server is running on http://127.0.0.1:${PORT}`);
});PHP
Jalankan perintah berikut untuk menginstal dependensi:
composer installContoh kode berikut memberikan contoh tentang cara mendapatkan kredensial akses sementara dari STS, menghitung tanda tangan yang dapat Anda gunakan untuk mengunggah objek, dan mengonfigurasi callback unggahan:
<?php
// Gunakan SDK Alibaba Cloud.
require_once __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use AlibabaCloud\Sts\Sts;
// Nonaktifkan tampilan kesalahan.
ini_set('display_errors', '0');
$bucket = 'examplebucket'; // Ganti examplebucket dengan nama bucket Anda.
$region_id = 'cn-hangzhou'; // Ganti cn-hangzhou dengan wilayah tempat bucket berada.
$host = 'http://examplebucket.oss-cn-hangzhou.aliyuncs.com'; // Ganti http://examplebucket.oss-cn-hangzhou.aliyuncs.com dengan nama domain bucket Anda.
$expire_time = 3600; // Tentukan periode validitas dalam detik.
$upload_dir = 'user-dir'; // Tentukan awalan dalam nama objek yang ingin Anda unggah ke OSS.
// Atur $callbackUrl ke URL server callback. Ganti alamat IP dan nomor port dengan informasi aktual Anda.
$callbackUrl = 'http://oss-demo.aliyuncs.com:23450/callback';
// Hitung nilai HMAC-SHA256.
function hmacsha256($key, $data) {
return hash_hmac('sha256', $data, $key, true);
}
// Memproses permintaan yang dimulai untuk mendapatkan tanda tangan.
if ($_SERVER['REQUEST_METHOD'] === 'GET' && $_SERVER['REQUEST_URI'] === '/get_post_signature_for_oss_upload') {
AlibabaCloud::accessKeyClient(getenv('OSS_ACCESS_KEY_ID'), getenv('OSS_ACCESS_KEY_SECRET'))
->regionId('cn-hangzhou')
->asDefaultClient();
// Buat permintaan untuk mendapatkan kredensial akses sementara dari STS.
$request = Sts::v20150401()->assumeRole();
// Kirim permintaan STS dan dapatkan hasilnya.
// Ganti <YOUR_ROLE_SESSION_NAME> dengan nama sesi kustom, seperti oss-role-session.
// Ganti <YOUR_ROLE_ARN> dengan ARN peran RAM yang memiliki izin untuk mengunggah objek ke bucket tertentu.
$result = $request
->withRoleSessionName('oss-role-session')
->withDurationSeconds(3600)
->withRoleArn(getenv('OSS_STS_ROLE_ARN')) // Ganti OSS_STS_ROLE_ARN dengan ARN peran RAM.
->request();
// Dapatkan informasi kredensial dalam respons permintaan STS.
$tokenData = $result->get('Credentials');
// Bangun data JSON dari hasil yang dikembalikan.
$tempAccessKeyId = $tokenData['AccessKeyId'];
$tempAccessKeySecret = $tokenData['AccessKeySecret'];
$securityToken = $tokenData['SecurityToken'];
$now = time();
$dtObj = gmdate('Ymd\THis\Z', $now);
$dtObj1 = gmdate('Ymd', $now);
$dtObjPlus3h = gmdate('Y-m-d\TH:i:s.u\Z', strtotime('+3 hours', $now));
// Buat kebijakan.
$policy = [
"expiration" => $dtObjPlus3h,
"conditions" => [
["x-oss-signature-version" => "OSS4-HMAC-SHA256"],
["x-oss-credential" => "{$tempAccessKeyId}/{$dtObj1}/cn-hangzhou/oss/aliyun_v4_request"],
["x-oss-security-token" => $securityToken],
["x-oss-date" => $dtObj],
]
];
$policyStr = json_encode($policy);
// Buat string-to-sign.
$stringToSign = base64_encode($policyStr);
// Hitung kunci penandatanganan.
$dateKey = hmacsha256(('aliyun_v4' . $tempAccessKeySecret), $dtObj1);
$dateRegionKey = hmacsha256($dateKey, 'cn-hangzhou');
$dateRegionServiceKey = hmacsha256($dateRegionKey, 'oss');
$signingKey = hmacsha256($dateRegionServiceKey, 'aliyun_v4_request');
// Hitung tanda tangan.
$result = hmacsha256($signingKey, $stringToSign);
$signature = bin2hex($result);
$callback_param = array(
'callbackUrl' => $callbackUrl,
'callbackBody' => 'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',
'callbackBodyType' => "application/x-www-form-urlencoded"
);
$callback_string = json_encode($callback_param);
$base64_callback_body = base64_encode($callback_string);
// Kembalikan data tanda tangan.
$responseData = [
'policy' => $stringToSign,
'x_oss_signature_version' => "OSS4-HMAC-SHA256",
'x_oss_credential' => "{$tempAccessKeyId}/{$dtObj1}/cn-hangzhou/oss/aliyun_v4_request",
'x_oss_date' => $dtObj,
'signature' => $signature,
'host' => $host,
'dir' => $upload_dir,
'security_token' => $securityToken,
'callback' => $base64_callback_body,
];
header('Content-Type: application/json');
echo json_encode($responseData);
exit;
}
// Tentukan rute halaman utama.
if ($_SERVER['REQUEST_METHOD'] === 'GET' && $_SERVER['REQUEST_URI'] === '/') {
echo file_get_contents(__DIR__ . '/public/index.html');
exit;
}
// Tentukan rute lainnya.
http_response_code(404);
echo json_encode(['message' => 'Not Found']);
exit;
?>Langkah 3: Konfigurasikan klien web
Buat dan kirimkan permintaan unggahan formulir di klien web
Setelah klien web menerima informasi yang diperlukan dari server, Anda dapat menggunakan informasi tersebut untuk membuat permintaan untuk membuat formulir HTML. Permintaan tersebut langsung dikirim ke OSS untuk mengunggah file.
Contoh respons yang diterima oleh klien web
Informasi berikut dikembalikan ke klien web dari server aplikasi.
{
"dir": "user-dirs",
"host": "http://examplebucket.oss-cn-hangzhou.aliyuncs.com",
"policy": "eyJl****",
"security_token": "CAIS****",
"signature": "9103****",
"x_oss_credential": "STS.NSpW****/20241127/cn-hangzhou/oss/aliyun_v4_request",
"x_oss_date": "20241127T060941Z",
"x_oss_signature_version": "OSS4-HMAC-SHA256"
"callback":"eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jb206MjM0NTAiLAoiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSZoZWlnaHQ9JHtpbWFnZUluZm8uaGVpZ2h0fSZ3aWR0aD0ke2ltYWdlSW5mby53aWR0aH0iLAoiY2FsbGJhY2tCb2R5VHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9"
}Tabel berikut menjelaskan bidang-bidang yang termasuk dalam body.
Bidang | Deskripsi |
dir | Awalan yang terkandung dalam nama objek yang ingin Anda unggah. |
host | Nama domain bucket. |
policy | Kebijakan untuk unggahan formulir. Untuk informasi lebih lanjut, lihat Kebijakan POST. |
security_token | Token keamanan yang diperoleh dari STS. |
signature | String tanda tangan kebijakan. Untuk informasi lebih lanjut, lihat Tanda Tangan POST. |
x_oss_credential | Set parameter yang digunakan untuk menentukan kunci turunan. |
x_oss_date | Waktu permintaan dimulai. Waktu harus mengikuti standar ISO 8601. Contoh: |
x_oss_signature_version | Versi tanda tangan dan algoritma yang digunakan untuk menghitung tanda tangan. Atur nilainya ke OSS4-HMAC-SHA256. |
callback | Konten callback. |
Permintaan formulir berisi konten file dan parameter yang dikembalikan oleh server.
Klien web dapat langsung berkomunikasi dengan OSS dan mengunggah file menggunakan permintaan formulir.
Kecuali untuk bidang formulir file, ukuran setiap bidang formulir (termasuk key) tidak boleh melebihi 8 KB.
Secara default, objek yang sudah ada dengan nama yang sama dengan objek yang ingin Anda unggah akan ditimpa. Jika Anda tidak ingin menimpa objek yang sudah ada, sertakan header x-oss-forbid-overwrite dalam permintaan unggahan dan atur header x-oss-forbid-overwrite ke true. Dengan cara ini, jika Anda mengunggah objek dengan nama yang sama dengan objek yang sudah ada di OSS, unggahan gagal dan OSS mengembalikan kode kesalahan FileAlreadyExists.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hasilkan tanda tangan di server untuk mengunggah file ke OSS</title>
</head>
<body>
<div class="container">
<form>
<div class="mb-3">
<label for="file" class="form-label">Pilih file:</label>
<input type="file" class="form-control" id="file" name="file" required />
</div>
<button type="submit" class="btn btn-primary">Unggah</button>
</form>
<div id="callback-info" class="mt-3" style="display: none;">
<h4>Informasi Callback:</h4>
<pre id="callback-content"></pre>
</div>
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function () {
const form = document.querySelector("form");
const fileInput = document.querySelector("#file");
const callbackInfo = document.querySelector("#callback-info");
const callbackContent = document.querySelector("#callback-content");
form.addEventListener("submit", (event) => {
event.preventDefault();
const file = fileInput.files[0];
if (!file) {
alert('Pilih objek untuk diunggah.');
return;
}
const filename = file.name;
fetch("/get_post_signature_for_oss_upload", { method: "GET" })
.then((response) => {
if (!response.ok) {
throw new Error("Gagal mendapatkan tanda tangan");
}
return response.json();
})
.then((data) => {
let formData = new FormData();
formData.append("success_action_status", "200");
formData.append("policy", data.policy);
formData.append("x-oss-signature", data.signature);
formData.append("x-oss-signature-version", "OSS4-HMAC-SHA256");
formData.append("x-oss-credential", data.x_oss_credential);
formData.append("x-oss-date", data.x_oss_date);
formData.append("key", data.dir + file.name); // Nama file.
formData.append("x-oss-security-token", data.security_token);
formData.append("callback", data.Callback); // Tentukan parameter callback.
formData.append("file", file); // Bidang formulir terakhir harus "file".
return fetch(data.host, {
method: "POST",
body: formData
});
})
.then((response) => {
if (response.ok) {
console.log("Diunggah");
alert("Objek berhasil diunggah");
return response.json(); // Analisis informasi callback.
} else {
console.log("Unggahan gagal", response);
alert("Gagal mengunggah objek. Coba unggah ulang objek");
}
})
.then((callbackData) => {
if (callbackData) {
callbackContent.textContent = JSON.stringify(callbackData, null, 2);
callbackInfo.style.display = "block";
}
})
.catch((error) => {
console.error("Terjadi kesalahan:", error);
});
});
});
</script>
</body>
</html>Formulir HTML berisi kotak input file dan ikon Kirim. Anda dapat memilih file untuk diunggah dan mengirimkan formulir.
Saat Anda mengirimkan formulir, pengiriman formulir default diblokir dengan menggunakan kode JavaScript, dan informasi tanda tangan yang diperlukan untuk unggahan diperoleh dari server menggunakan permintaan Asynchronous JavaScript and XML (AJAX).
Setelah Anda mendapatkan informasi tanda tangan, buat objek
FormDatayang berisi semua bidang formulir yang diperlukan.Anda dapat menggunakan metode
fetchuntuk mengirim permintaan POST ke URL layanan OSS dan mengunggah objek.
Jika file berhasil diunggah, pesan "File berhasil diunggah" akan ditampilkan. Jika file gagal diunggah, pesan kesalahan akan ditampilkan. Informasi callback yang sesuai dikembalikan pada halaman frontend.
Verifikasi hasil
Setelah Anda menyelesaikan langkah-langkah sebelumnya, Anda dapat mengakses server aplikasi untuk menghasilkan tanda tangan dan mengunggah objek dari klien web ke OSS.
Masukkan URL server aplikasi di browser, pilih objek yang ingin Anda unggah, lalu klik ikon Unggah untuk mengunggah objek.
Di halaman Buckets, klik nama bucket yang Anda buat untuk menyimpan objek yang diunggah. Di halaman yang muncul, lihat objek yang Anda unggah dari klien web.
Lepaskan sumber daya
Untuk membangun aplikasi web, Anda membuat instance ECS, bucket OSS, pengguna RAM, dan peran RAM. Setelah Anda berhasil mengunggah objek ke OSS, Anda dapat melepaskan sumber daya tersebut untuk mencegah biaya yang tidak perlu dan menghilangkan risiko keamanan terkait.
Lepaskan instance ECS
Jika Anda tidak lagi memerlukan instance ECS yang Anda buat, Anda dapat melepaskan instance tersebut. Setelah instance ECS dilepaskan, penagihan untuk instance tersebut berhenti, dan data pada instance hilang dan tidak dapat dipulihkan. Prosedur:
Pergi ke halaman Instance di ECS console, temukan instance ECS berdasarkan wilayah dan ID instance-nya, lalu klik ikon
di kolom Actions.Pilih Instance Status > Release.

Di kotak dialog Lepas, atur Mode Lepas ke Release Now dan klik Next.
Konfirmasikan sumber daya terkait yang ingin Anda lepaskan, baca catatan tentang risiko data, pilih "Saya mengetahui instance dan sumber daya terkait yang akan dilepaskan serta memahami risiko data", lalu klik OK.
Saat instance ECS dilepaskan, disk sistem instance tersebut juga dilepaskan. Jika alamat IP publik telah ditetapkan ke instance, alamat IP tersebut juga dilepaskan.
Saat instance ECS dilepaskan, grup keamanan terkait, vSwitch, dan VPC tidak dilepaskan. Anda tidak dikenakan biaya untuk grup keamanan, vSwitch, atau VPC. Anda dapat mempertahankan atau melepaskannya berdasarkan persyaratan bisnis Anda.
Jika EIP terkait dengan instance ECS, EIP dipertahankan saat instance dilepaskan. Anda dikenakan biaya untuk EIP. Anda dapat mempertahankan atau melepaskan EIP berdasarkan persyaratan bisnis Anda.
Hapus bucket
Masuk ke konsol OSS.
Di panel navigasi di sebelah kiri, klik Buckets. Di halaman Buckets, klik nama bucket yang ingin Anda hapus.
Hapus semua objek di dalam bucket dan kemudian hapus bucket tersebut.
Di pohon navigasi sebelah kiri, klik Delete Bucket. Di halaman Hapus Bucket, ikuti petunjuk di layar untuk menghapus bucket.
Hapus pengguna RAM
Masuk ke konsol RAM sebagai pengguna RAM yang memiliki hak admin.
Di panel navigasi sebelah kiri, pilih Identities > Users.
Di halaman Users, temukan pengguna RAM yang ingin Anda hapus dan klik Delete di kolom Actions.
Anda juga dapat memilih beberapa pengguna RAM dan klik Delete User di bawah daftar pengguna RAM untuk memindahkan semua pengguna RAM yang dipilih ke tempat sampah secara bersamaan.
Di kotak dialog Delete User, masukkan nama pengguna RAM dan klik Move to Recycle Bin.
Hapus peran RAM
Masuk ke konsol RAM sebagai pengguna RAM yang memiliki hak admin.
Di panel navigasi sebelah kiri, pilih Identities > Roles.
Di halaman Roles, temukan peran RAM yang ingin Anda hapus dan klik Delete Role di kolom Actions.
Di kotak dialog Delete Role, masukkan nama peran RAM dan klik Delete Role.
CatatanJika kebijakan dilampirkan ke peran RAM, kebijakan tersebut dilepas saat Anda menghapus peran RAM.
Tanya Jawab Umum
Bagaimana cara mengunggah beberapa objek ke OSS sekaligus?
OSS tidak menyediakan operasi API untuk Anda mengunggah beberapa objek sekaligus. Jika Anda ingin mengunggah beberapa objek ke OSS sekaligus, Anda dapat mengulangi langkah-langkah untuk mengunggah satu objek.
Apakah saya bisa menentukan header permintaan callback saat saya mendapatkan informasi tanda tangan dari server dan mengonfigurasikan callback unggahan?
Tidak. Anda hanya dapat menentukan parameter callback kustom, yaitu body permintaan callback. Namun, Anda tidak dapat menentukan header yang disertakan dalam permintaan callback OSS ke URL callback.