Security Token Service (STS) menghasilkan kredensial sementara yang memberikan pengguna akses terbatas waktu ke sumber daya OSS tertentu sesuai kebijakan yang ditentukan. Kredensial ini kedaluwarsa secara otomatis, sehingga memastikan kontrol akses yang fleksibel dan berbasis durasi.
Kasus penggunaan
Perusahaan e-commerce, Perusahaan A, menyimpan sejumlah besar data produk di Alibaba Cloud OSS. Seorang pemasok, Perusahaan B, perlu secara rutin mengunggah data ke OSS milik Perusahaan A dan mengintegrasikan sistemnya sendiri dengan sumber daya Alibaba Cloud milik Perusahaan A.
Perusahaan A memiliki persyaratan keamanan berikut:
Keamanan data: Perusahaan A tidak ingin mengekspos pasangan AccessKey jangka panjangnya kepada Perusahaan B untuk mencegah akses tidak sah atau penyalahgunaan data intinya.
Kontrol izin: Perusahaan A hanya ingin memberikan izin unggah kepada Perusahaan B pada awalnya dan menyesuaikannya nanti sesuai kebutuhan. Hal ini memberikan kontrol presisi atas hak akses.
Manajemen izin: Untuk Perusahaan B dan mitra mendatang, Perusahaan A ingin menghasilkan kredensial untuk setiap mitra atau kebutuhan sementara, sehingga menghilangkan kebutuhan untuk terus-menerus mengelola pasangan AccessKey jangka panjang.
Kontrol akses berdurasi terbatas: Perusahaan A ingin membatasi durasi akses data oleh Perusahaan B. Saat kredensial kedaluwarsa, Perusahaan B secara otomatis kehilangan akses, memastikan kontrol ketat atas durasi akses.
Cara kerja
Perusahaan A menggunakan kredensial sementara untuk mengotorisasi Perusahaan B agar dapat mengunggah file ke OSS secara aman.
Pertama, Perusahaan A membuat RAM user dan RAM role dengan izin yang diperlukan. Saat Perusahaan B meminta akses, Perusahaan A memanggil operasi AssumeRole untuk mendapatkan kredensial sementara STS dan meneruskannya ke Perusahaan B. Dengan kredensial tersebut, Perusahaan B dapat mengunggah data ke OSS milik Perusahaan A.
Prasyarat
Perusahaan A telah membuat bucket. Untuk informasi selengkapnya, lihat Buat bucket.
Langkah 1: Perusahaan A menerbitkan kredensial sementara
1. Buat RAM user
Gunakan Akun Alibaba Cloud atau RAM user dengan izin administratif RAM untuk membuat RAM user.
Masuk ke Konsol RAM.
Di panel navigasi kiri, pilih Identities > Users.
Klik Create User.
Masukkan Logon Name dan Display Name.
Pada bagian Access Mode, pilih OpenAPI Access lalu klik OK.
Lengkapi verifikasi keamanan sesuai petunjuk.
Salin ID AccessKey dan Rahasia AccessKey.
PentingRahasia AccessKey RAM user hanya ditampilkan saat pembuatan dan tidak dapat diambil kembali nanti. Unduh file CSV yang berisi pasangan AccessKey dan simpan dengan aman.

2. Berikan izin AssumeRole kepada RAM user
Setelah membuat RAM user, gunakan Akun Alibaba Cloud atau RAM user dengan izin administratif RAM untuk memberikan izin kepada RAM user tersebut agar dapat memanggil layanan STS dengan mengasumsikan suatu role.
Masuk ke Konsol RAM.
Di panel navigasi kiri, pilih Identities > Users. Di daftar pengguna, temukan RAM user tersebut lalu klik Add Permissions di kolom Actions.
Pada halaman Grant Permission, pilih kebijakan sistem AliyunSTSAssumeRoleAccess.
CatatanKebijakan AliyunSTSAssumeRoleAccess memberikan izin kepada RAM user untuk memanggil operasi STS
AssumeRole. Ini berbeda dari izin yang diberikan oleh role itu sendiri, yang akan diwarisi oleh kredensial sementara.
Klik OK.
3. Buat RAM role
Gunakan Akun Alibaba Cloud atau RAM user dengan izin administratif RAM untuk membuat RAM role. Role ini menentukan izin akses OSS yang diberikan saat diassumsikan.
Masuk ke Konsol RAM.
Di panel navigasi kiri, pilih Identities > Roles.
Di halaman Roles, klik Create Role.
Di halaman Create Role, atur Principal Type menjadi Alibaba Cloud Account dan Principal Name menjadi Current Alibaba Cloud Account. Lalu, klik OK.

Di kotak dialog Create Role, masukkan nama role lalu klik OK.
Klik Copy di samping ARN lalu simpan ARN role tersebut.

4. Berikan izin unggah file kepada RAM role
Setelah membuat RAM role, gunakan Akun Alibaba Cloud atau RAM user dengan izin administratif RAM untuk menyambungkan kebijakan ke role tersebut. Kebijakan ini menentukan izin akses OSS yang diberikan oleh role.
Buat kebijakan kustom untuk unggah file.
Masuk ke Konsol RAM.
Di panel navigasi kiri, pilih Permissions > Policies.
Di halaman Policies, klik Create Policy.
Di halaman Create Policy, klik tab JSON Editor. Di editor kebijakan, berikan izin kepada role untuk mengunggah file ke examplebucket. Contoh kode berikut disediakan:
PeringatanContoh berikut hanya untuk referensi. Untuk keamanan optimal, kami menyarankan Anda mengonfigurasi kebijakan otorisasi detail halus untuk menghindari risiko izin berlebihan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kebijakan otorisasi detail halus, lihat Berikan izin kepada pengguna lain menggunakan RAM atau STS.
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }CatatanIzin OSS RAM role ditentukan oleh konfigurasi
Action. Misalnya, jika Anda memberikan izinoss:PutObject, RAM user yang mengasumsikan RAM role tersebut dapat melakukan operasi unggah simple, unggah form, unggah append, unggah multi-bagian, dan unggah yang dapat dilanjutkan pada bucket yang ditentukan. Untuk informasi selengkapnya, lihat Aksi OSS.Setelah mengonfigurasi kebijakan, klik OK. Di halaman Edit Basic Information, masukkan nama kebijakan, misalnya RamTestPolicy, lalu klik OK.
Berikan kebijakan kustom kepada RAM role RamOssTest.
Masuk ke Konsol RAM.
Di panel navigasi kiri, pilih Identities > Roles.
Di halaman Roles, temukan RAM role target RamOssTest.
Klik Add Permissions di kolom Actions untuk RAM role RamOssTest.
Di halaman Grant Permission, pilih Custom Policy di bagian Select Policy. Lalu, klik kebijakan kustom yang telah dibuat RamTestPolicy di daftar kebijakan.
Klik OK.
5. Asumsikan RAM role dan peroleh kredensial sementara
Jangan gunakan pasangan AccessKey Akun Alibaba Cloud untuk memanggil operasi API STS demi mendapatkan kredensial sementara; hal ini akan menyebabkan error. Contoh berikut menggunakan pasangan AccessKey RAM user.
Setelah memberikan izin unggah file ke role tersebut, RAM user perlu mengasumsikan role untuk mendapatkan kredensial sementara. Kredensial sementara terdiri dari token keamanan, pasangan AccessKey sementara (ID AccessKey dan Rahasia AccessKey), serta waktu kedaluwarsa. Anda dapat menggunakan SDK STS untuk mendapatkan kredensial sementara yang memiliki izin unggah simple (
oss:PutObject). Untuk contoh SDK STS dalam bahasa pemrograman lainnya, lihat Ikhtisar SDK STS.endpoint dalam contoh kode adalah alamat endpoint STS. Untuk respons STS yang lebih cepat, pilih endpoint STS di wilayah yang sama dengan server Anda, atau yang terdekat. Untuk informasi selengkapnya tentang endpoint STS, lihat Endpoint.
Java
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
public class StsServiceSample {
public static void main(String[] args) {
// Endpoint layanan STS. Contoh: sts.cn-hangzhou.aliyuncs.com. Anda dapat mengakses layanan STS melalui internet atau melalui VPC.
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
// Peroleh ID AccessKey dan Rahasia AccessKey RAM user yang Anda buat di Langkah 1 dari variabel lingkungan.
String accessKeyId = System.getenv("ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ACCESS_KEY_SECRET");
// Peroleh ARN RAM role yang Anda buat di Langkah 3 dari variabel lingkungan.
String roleArn = System.getenv("RAM_ROLE_ARN");
// Tentukan nama sesi role kustom untuk membedakan token yang berbeda. Contoh: SessionTest.
String roleSessionName = "yourRoleSessionName";
// Secara default, kredensial sementara memiliki semua izin dari role yang diasumsikan.
String policy = null;
// Durasi validitas kredensial sementara dalam detik. Nilai minimum: 900. Nilai maksimum: nilai parameter Maximum Session Duration dari role. Nilai parameter ini dapat berkisar antara 3.600 hingga 43.200 detik. Nilai default: 3.600 detik.
// Saat mengunggah file besar atau melakukan operasi lain yang memakan waktu, kami menyarankan Anda menentukan durasi validitas yang cukup untuk menghindari pemanggilan berulang layanan STS demi mendapatkan kredensial sementara baru.
Long durationSeconds = 3600L;
try {
// Wilayah tempat permintaan STS diajukan. Kami menyarankan Anda mempertahankan nilai default, yaitu string kosong ("").
String regionId = "";
// Tambahkan endpoint. Ini berlaku untuk STS SDK for Java 3.12.0 dan versi lebih baru.
DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
// Tambahkan endpoint. Ini berlaku untuk STS SDK for Java versi sebelum 3.12.0.
// DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
// Bangun profil default.
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
// Bangun klien.
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
// Ini berlaku untuk STS SDK for Java 3.12.0 dan versi lebih baru.
request.setSysMethod(MethodType.POST);
// Ini berlaku untuk STS SDK for Java versi sebelum 3.12.0.
// request.setMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
request.setDurationSeconds(durationSeconds);
final AssumeRoleResponse response = client.getAcsResponse(request);
System.out.println("Expiration: " + response.getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
System.out.println("RequestId: " + response.getRequestId());
} catch (ClientException e) {
System.out.println("Failed:");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
System.out.println("RequestId: " + e.getRequestId());
}
}
}Python
# -*- coding: utf-8 -*-
from aliyunsdkcore import client
from aliyunsdkcore.request import CommonRequest
import json
import oss2
import os
# Peroleh ID AccessKey dan Rahasia AccessKey RAM user yang Anda buat di Langkah 1 dari variabel lingkungan.
access_key_id = os.getenv("ACCESS_KEY_ID")
access_key_secret = os.getenv("ACCESS_KEY_SECRET")
# Peroleh ARN RAM role yang Anda buat di Langkah 3 dari variabel lingkungan.
role_arn = os.getenv("RAM_ROLE_ARN")
# Buat kebijakan.
clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
request = CommonRequest(product="Sts", version='2015-04-01', action_name='AssumeRole')
request.set_method('POST')
request.set_protocol_type('https')
request.add_query_param('RoleArn', role_arn)
# Tentukan nama sesi role kustom untuk membedakan token yang berbeda. Contoh: sessiontest.
request.add_query_param('RoleSessionName', 'sessiontest')
# Tentukan bahwa kredensial sementara STS kedaluwarsa dalam 3.600 detik.
request.add_query_param('DurationSeconds', '3600')
request.set_accept_format('JSON')
body = clt.do_action_with_exception(request)
# Gunakan ID AccessKey dan Rahasia AccessKey RAM user untuk meminta kredensial sementara dari STS.
token = json.loads(oss2.to_unicode(body))
# Cetak pasangan AccessKey sementara (ID AccessKey dan Rahasia AccessKey), token keamanan, dan waktu kedaluwarsa yang dikembalikan oleh STS.
print('AccessKeyId: ' + token['Credentials']['AccessKeyId'])
print('AccessKeySecret: ' + token['Credentials']['AccessKeySecret'])
print('SecurityToken: ' + token['Credentials']['SecurityToken'])
print('Expiration: ' + token['Credentials']['Expiration'])Node.js
const { STS } = require('ali-oss');
const express = require("express");
const app = express();
app.get('/sts', (req, res) => {
let sts = new STS({
// Peroleh ID AccessKey dan Rahasia AccessKey RAM user yang Anda buat di Langkah 1 dari variabel lingkungan.
accessKeyId : process.env.ACCESS_KEY_ID,
accessKeySecret : process.env.ACCESS_KEY_SECRET
});
// process.env.RAM_ROLE_ARN digunakan untuk memperoleh ARN RAM role yang Anda buat di Langkah 3 dari variabel lingkungan.
// Tentukan kebijakan kustom untuk lebih membatasi izin kredensial sementara STS. Jika Anda tidak menentukan kebijakan, kredensial sementara STS yang dikembalikan memiliki semua izin dari role yang ditentukan.
// Izin akhir kredensial sementara adalah irisan antara izin role yang Anda atur di Langkah 4 dan izin yang Anda atur dalam kebijakan ini.
// Parameter expiration menentukan periode validitas kredensial sementara dalam detik. Nilai minimum: 900. Nilai maksimum: nilai parameter Maximum Session Duration dari role. Pada contoh ini, periode validitas diatur menjadi 3.600 detik.
// Parameter sessionName menentukan nama sesi role kustom untuk membedakan token yang berbeda. Contoh: sessiontest.
sts.assumeRole('process.env.RAM_ROLE_ARN', ``, '3600', 'sessiontest').then((result) => {
console.log(result);
res.set('Access-Control-Allow-Origin', '*');
res.set('Access-Control-Allow-METHOD', 'GET');
res.json({
AccessKeyId: result.credentials.AccessKeyId,
AccessKeySecret: result.credentials.AccessKeySecret,
SecurityToken: result.credentials.SecurityToken,
Expiration: result.credentials.Expiration
});
}).catch((err) => {
console.log(err);
res.status(400).json(err.message);
});
});
app.listen(8000,()=>{
console.log("server listen on:8000")
})Go
package main
import (
"fmt"
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func main() {
// Peroleh ID AccessKey dan Rahasia AccessKey RAM user yang Anda buat di Langkah 1 dari variabel lingkungan.
accessKeyId := os.Getenv("ACCESS_KEY_ID")
accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")
// Peroleh ARN RAM role yang Anda buat di Langkah 3 dari variabel lingkungan.
roleArn := os.Getenv("RAM_ROLE_ARN")
// Buat klien kebijakan.
config := &openapi.Config{
// Wajib. ID AccessKey yang Anda peroleh di Langkah 1.
AccessKeyId: tea.String(accessKeyId),
// Wajib. Rahasia AccessKey yang Anda peroleh di Langkah 1.
AccessKeySecret: tea.String(accessKeySecret),
}
// Untuk informasi selengkapnya tentang endpoint, lihat https://api.aliyun.com/product/Sts
config.Endpoint = tea.String("sts.cn-hangzhou.aliyuncs.com")
client, err := sts20150401.NewClient(config)
if err != nil {
fmt.Printf("Gagal membuat klien: %v\n", err)
return
}
// Gunakan ID AccessKey dan Rahasia AccessKey RAM user untuk meminta kredensial sementara dari STS.
request := &sts20150401.AssumeRoleRequest{
// Tentukan bahwa kredensial sementara STS kedaluwarsa dalam 3.600 detik.
DurationSeconds: tea.Int64(3600),
// Peroleh ARN RAM role yang Anda buat di Langkah 3 dari variabel lingkungan.
RoleArn: tea.String(roleArn),
// Tentukan nama sesi role kustom. Pada contoh ini, gunakan examplename.
RoleSessionName: tea.String("examplename"),
}
response, err := client.AssumeRoleWithOptions(request, &util.RuntimeOptions{})
if err != nil {
fmt.Printf("Gagal mengasumsikan role: %v\n", err)
return
}
// Cetak pasangan AccessKey sementara (ID AccessKey dan Rahasia AccessKey), token keamanan, dan waktu kedaluwarsa yang dikembalikan oleh STS.
credentials := response.Body.Credentials
fmt.Println("AccessKeyId: " + tea.StringValue(credentials.AccessKeyId))
fmt.Println("AccessKeySecret: " + tea.StringValue(credentials.AccessKeySecret))
fmt.Println("SecurityToken: " + tea.StringValue(credentials.SecurityToken))
fmt.Println("Expiration: " + tea.StringValue(credentials.Expiration))
}PHP
<?php
require __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use AlibabaCloud\Sts\Sts;
// Peroleh ID AccessKey dan Rahasia AccessKey RAM user yang Anda buat di Langkah 1 dari variabel lingkungan.
$accessKeyId = getenv("ACCESS_KEY_ID");
$accessKeySecret = getenv("ACCESS_KEY_SECRET");
// Peroleh ARN RAM role yang Anda buat di Langkah 3 dari variabel lingkungan.
$roleArn = getenv("RAM_ROLE_ARN");
// Inisialisasi klien Alibaba Cloud.
AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
->regionId('cn-hangzhou')
->asDefaultClient();
try {
// Buat permintaan STS.
$result = Sts::v20150401()
->assumeRole()
// Atur ARN role.
->withRoleArn($roleArn)
// Tentukan nama sesi role kustom untuk membedakan token yang berbeda.
->withRoleSessionName('sessiontest')
// Tentukan bahwa kredensial sementara STS kedaluwarsa dalam 3.600 detik.
->withDurationSeconds(3600)
->request();
// Peroleh informasi kredensial dari respons.
$credentials = $result['Credentials'];
// Cetak pasangan AccessKey sementara (ID AccessKey dan Rahasia AccessKey), token keamanan, dan waktu kedaluwarsa yang dikembalikan oleh STS.
echo 'AccessKeyId: ' . $credentials['AccessKeyId'] . PHP_EOL;
echo 'AccessKeySecret: ' . $credentials['AccessKeySecret'] . PHP_EOL;
echo 'SecurityToken: ' . $credentials['SecurityToken'] . PHP_EOL;
echo 'Expiration: ' . $credentials['Expiration'] . PHP_EOL;
} catch (ClientException $e) {
// Tangani exception klien.
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
// Tangani exception server.
echo $e->getErrorMessage() . PHP_EOL;
}Ruby
require 'sinatra'
require 'base64'
require 'open-uri'
require 'cgi'
require 'openssl'
require 'json'
require 'sinatra/reloader'
require 'sinatra/content_for'
require 'aliyunsdkcore'
# Atur path folder publik ke subfolder templates di folder saat ini.
set :public_folder, File.dirname(__FILE__) + '/templates'
def get_sts_token_for_oss_upload()
client = RPCClient.new(
# Peroleh ID AccessKey dan Rahasia AccessKey RAM user yang Anda buat di Langkah 1 dari variabel lingkungan.
access_key_id: ENV['ACCESS_KEY_ID'],
access_key_secret: ENV['ACCESS_KEY_SECRET'],
endpoint: 'https://sts.cn-hangzhou.aliyuncs.com',
api_version: '2015-04-01'
)
response = client.request(
action: 'AssumeRole',
params: {
# Peroleh ARN RAM role yang Anda buat di Langkah 3 dari variabel lingkungan.
"RoleArn": ENV['RAM_ROLE_ARN'],
# Tentukan bahwa kredensial sementara STS kedaluwarsa dalam 3.600 detik.
"DurationSeconds": 3600,
# Parameter sessionName menentukan nama sesi role kustom untuk membedakan token yang berbeda. Contoh: sessiontest.
"RoleSessionName": "sessiontest"
},
opts: {
method: 'POST',
format_params: true
}
)
end
if ARGV.length == 1
$server_port = ARGV[0]
elsif ARGV.length == 2
$server_ip = ARGV[0]
$server_port = ARGV[1]
end
$server_ip = "127.0.0.1" # Untuk mendengarkan alamat lain seperti 0.0.0.0, Anda harus menambahkan mekanisme autentikasi di server.
$server_port = 8000
puts "App server is running on: http://#{$server_ip}:#{$server_port}"
set :bind, $server_ip
set :port, $server_port
get '/get_sts_token_for_oss_upload' do
token = get_sts_token_for_oss_upload()
response = {
"AccessKeyId" => token["Credentials"]["AccessKeyId"],
"AccessKeySecret" => token["Credentials"]["AccessKeySecret"],
"SecurityToken" => token["Credentials"]["SecurityToken"],
"Expiration" => token["Credentials"]["Expiration"]
}
response.to_json
end
get '/*' do
puts "********************* GET "
send_file File.join(settings.public_folder, 'index.html')
endKredensial sementara STS adalah sebagai berikut:
CatatanAkun Alibaba Cloud dan RAM user serta RAM role di bawah akun tersebut dapat memanggil layanan STS untuk mendapatkan kredensial sementara hingga 100 kali per detik. Dalam skenario konkurensi tinggi, kami menyarankan Anda menggunakan kembali kredensial sementara tersebut dalam periode validitasnya.
Waktu kedaluwarsa kredensial sementara STS dalam UTC. UTC berada 8 jam di belakang China Standard Time (CST). Misalnya, jika waktu kedaluwarsa kredensial sementara adalah 2024-04-18T11:33:40Z, kredensial sementara tersebut kedaluwarsa pada pukul 19:33:40 tanggal 18 April 2024 (UTC+8).
{ "AccessKeyId": "STS.****************", "AccessKeySecret": "3dZn*******************************************", "SecurityToken": "CAIS*****************************************************************************************************************************************", "Expiration": "2024-**-*****:**:50Z" }
Untuk mengonfigurasi izin akses sementara dengan granularitas lebih detail, lihat konten berikut.
Untuk lebih membatasi izin yang diwarisi dari role, Anda dapat menentukan kebijakan tambahan saat meminta kredensial sementara. Misalnya, jika role diberikan izin untuk mengunggah file ke examplebucket, Anda dapat membatasi kredensial sementara hanya untuk mengunggah file ke direktori tertentu di bucket tersebut.
// Kebijakan berikut membatasi kredensial sementara hanya mengizinkan pengunggahan file ke direktori src di examplebucket. // Izin akhir kredensial sementara adalah irisan antara izin role yang diatur di Langkah 4 dan izin yang diatur dalam kebijakan ini, artinya file hanya dapat diunggah ke direktori src di examplebucket. String policy = "{\n" + " \"Version\": \"1\", \n" + " \"Statement\": [\n" + " {\n" + " \"Action\": [\n" + " \"oss:PutObject\"\n" + " ], \n" + " \"Resource\": [\n" + " \"acs:oss:*:*:examplebucket/src/*\" \n" + " ], \n" + " \"Effect\": \"Allow\"\n" + " }\n" + " ]\n" + "}";
Langkah 2: Unggah file dengan kredensial sementara
Karena perubahan kebijakan untuk meningkatkan kepatuhan dan keamanan, mulai 20 Maret 2025, pengguna OSS baru harus menggunakan nama domain kustom (CNAME) untuk melakukan operasi API data pada bucket OSS yang berlokasi di wilayah daratan Tiongkok. Titik akhir publik default dibatasi untuk operasi ini. Lihat pengumuman resmi untuk daftar lengkap operasi yang terdampak. Jika Anda mengakses data melalui HTTPS, Anda harus mengikat Sertifikat SSL yang valid ke domain kustom Anda. Ini wajib untuk akses Konsol OSS, karena konsol menerapkan HTTPS.
Contoh berikut menunjukkan cara menggunakan kredensial sementara untuk mengunggah file ke OSS. Untuk instalasi SDK dan contoh kode lebih lanjut untuk berbagai operasi, seperti unggah dan unduh file, menggunakan kredensial sementara, lihat Referensi SDK.
Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Exception {
// Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token keamanan yang Anda peroleh di Langkah 1 Sublangkah 5. Jangan gunakan kredensial identitas RAM user.
// Perhatikan bahwa ID AccessKey yang diperoleh dari layanan STS dimulai dengan "STS".
String accessKeyId = "yourSTSAccessKeyID";
String accessKeySecret = "yourSTSAccessKeySecret";
// Tentukan token keamanan yang Anda peroleh dari STS.
String stsToken= "yourSecurityToken";
// Gunakan metode DefaultCredentialProvider untuk langsung mengatur ID AccessKey dan Rahasia AccessKey.
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
// Inisialisasi klien menggunakan credentialsProvider.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Secara eksplisit nyatakan bahwa algoritma signature V4 digunakan.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Buat instance OSSClient.
// Saat instance OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
OSS ossClient = OSSClientBuilder.create()
// Atur nama domain akses OSS. Contoh untuk wilayah Tiongkok (Hangzhou): https://oss-cn-hangzhou.aliyuncs.com
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
// Atur wilayah bucket tujuan. Contoh untuk wilayah Tiongkok (Hangzhou): cn-hangzhou
.region("region")
.build();
try {
// Buat objek PutObjectRequest untuk mengunggah file lokal exampletest.txt ke examplebucket.
PutObjectRequest putObjectRequest = new PutObjectRequest("examplebucket", "exampletest.txt", new File("D:\\localpath\\exampletest.txt"));
// Jika Anda perlu mengatur kelas penyimpanan dan izin akses selama pengunggahan, lihat contoh kode berikut.
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// Unggah file.
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
+ "tetapi ditolak dengan respons error karena suatu alasan.");
System.out.println("Pesan Error:" + oe.getErrorMessage());
System.out.println("Kode Error:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("ID Host:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Terjadi ClientException, yang berarti klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Error:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Python
OSS SDK untuk Python tersedia dalam V2 dan V1. V2 merupakan penyempurnaan komprehensif dari V1 yang menyederhanakan operasi dasar seperti verifikasi identitas, percobaan ulang permintaan, dan penanganan error. SDK ini juga menyediakan konfigurasi parameter yang lebih fleksibel dan antarmuka lanjutan baru. Lihat contoh berikut sesuai kebutuhan Anda.
Contoh V2
import alibabacloud_oss_v2 as oss
def main():
# Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token keamanan yang Anda peroleh di Langkah 1 Sublangkah 5. Jangan gunakan kredensial identitas RAM user.
# Perhatikan bahwa ID AccessKey yang diperoleh dari layanan STS dimulai dengan "STS".
sts_access_key_id = 'yourSTSAccessKeyID'
sts_access_key_secret = 'yourSTSAccessKeySecret'
# Tentukan token keamanan yang Anda peroleh dari STS.
sts_security_token = 'yourSecurityToken'
# Buat penyedia kredensial statis dan atur secara eksplisit ID AccessKey sementara, Rahasia AccessKey, dan token keamanan.
credentials_provider = oss.credentials.StaticCredentialsProvider(
access_key_id=sts_access_key_id,
access_key_secret=sts_access_key_secret,
security_token=sts_security_token,
)
# Muat konfigurasi default SDK dan atur penyedia kredensial.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Tentukan wilayah bucket. Contoh untuk Tiongkok (Hangzhou): cn-hangzhou.
cfg.region = 'cn-hangzhou'
# Buat klien OSS menggunakan informasi yang telah dikonfigurasi.
client = oss.Client(cfg)
# Path file lokal yang akan diunggah. Contoh: D:\\localpath\\exampletest.txt.
local_file_path = 'D:\\localpath\\exampletest.txt'
with open(local_file_path, 'rb') as file:
data = file.read()
# Jalankan permintaan unggah objek untuk mengunggah file lokal exampletest.txt ke examplebucket. Tentukan nama bucket, nama objek, dan file yang akan diunggah.
result = client.put_object(oss.PutObjectRequest(
# Nama bucket
bucket='examplebucket',
# Nama objek yang akan diunggah ke bucket
key='exampletest.txt',
body=data,
))
# Keluarkan kode status permintaan, ID permintaan, MD5 konten, ETag, checksum CRC-64, dan ID versi untuk memeriksa apakah permintaan berhasil.
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
)
# Saat skrip ini dijalankan secara langsung, panggil fungsi main.
if __name__ == "__main__":
main() # Titik masuk skrip. Saat file dijalankan secara langsung, fungsi main dipanggil.Contoh V1
# -*- coding: utf-8 -*-
import oss2
# yourEndpoint menentukan endpoint wilayah bucket. Contoh untuk Tiongkok (Hangzhou): https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan ID AccessKey sementara dan Rahasia AccessKey yang Anda peroleh di Langkah 1 Sublangkah 5. Jangan gunakan ID AccessKey dan Rahasia AccessKey Akun Alibaba Cloud.
sts_access_key_id = 'yourAccessKeyId'
sts_access_key_secret = 'yourAccessKeySecret'
# Tentukan nama bucket.
bucket_name = 'examplebucket'
# Tentukan path lengkap objek. Path lengkap objek tidak boleh mengandung nama bucket.
object_name = 'examplebt.txt'
# Tentukan token keamanan yang Anda peroleh di Langkah 1 Sublangkah 5.
security_token = 'yourSecurityToken'
# Inisialisasi instance StsAuth menggunakan informasi autentikasi dari kredensial sementara.
auth = oss2.StsAuth(sts_access_key_id,
sts_access_key_secret,
security_token)
# Inisialisasi bucket menggunakan instance StsAuth.
bucket = oss2.Bucket(auth, endpoint, bucket_name)
# Unggah objek.
result = bucket.put_object(object_name, "hello world")
print(result.status)Go
OSS SDK untuk Go tersedia dalam V2 dan V1. V2 merupakan penyempurnaan komprehensif dari V1 yang menyederhanakan operasi dasar seperti verifikasi identitas, percobaan ulang permintaan, dan penanganan error. SDK ini juga menyediakan konfigurasi parameter yang lebih fleksibel dan antarmuka lanjutan baru. Lihat contoh berikut sesuai kebutuhan Anda.
Contoh V2
package main
import (
"context"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
// Tentukan wilayah bucket. Contoh untuk Tiongkok (Hangzhou): cn-hangzhou.
region := "cn-hangzhou"
// Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token keamanan yang Anda peroleh di Langkah 1 Sublangkah 5. Jangan gunakan kredensial identitas RAM user.
// Perhatikan bahwa ID AccessKey yang diperoleh dari layanan STS dimulai dengan "STS".
accessKeyID := "yourSTSAccessKeyID"
accessKeySecret := "yourSTSAccessKeySecret"
// Tentukan token keamanan yang Anda peroleh dari STS.
stsToken := "yourSecurityToken"
// Gunakan metode NewStaticCredentialsProvider untuk langsung mengatur ID AccessKey, Rahasia AccessKey, dan token STS.
provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret, stsToken)
// Muat konfigurasi default dan atur penyedia kredensial serta wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(provider).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Tentukan path dan nama file lokal yang akan diunggah. Contoh: D:\\localpath\\exampletest.txt.
localFile := "D:\\localpath\\exampletest.txt"
// Buat permintaan untuk mengunggah objek.
putRequest := &oss.PutObjectRequest{
Bucket: oss.Ptr("examplebucket"), // Nama bucket
Key: oss.Ptr("exampletest.txt"), // Nama objek yang akan diunggah ke bucket
StorageClass: oss.StorageClassStandard, // Atur kelas penyimpanan objek ke Standard.
Acl: oss.ObjectACLPrivate, // Atur daftar kontrol akses (ACL) objek ke private.
Metadata: map[string]string{
"yourMetadataKey1": "yourMetadataValue1", // Atur metadata objek.
},
}
// Jalankan permintaan unggah objek untuk mengunggah file lokal exampletest.txt ke examplebucket.
result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
if err != nil {
log.Fatalf("gagal mengunggah objek dari file %v", err)
}
// Cetak hasil unggah objek.
log.Printf("hasil unggah objek dari file:%#v\n", result)
}Contoh V1
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// Peroleh kredensial sementara dari variabel lingkungan yang Anda peroleh di Langkah 1 Sublangkah 5. Sebelum menjalankan contoh kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN telah diatur.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat instance OSSClient.
// yourEndpoint menentukan endpoint bucket. Contoh untuk Tiongkok (Hangzhou): https://oss-cn-hangzhou.aliyuncs.com. Tentukan endpoint sesuai wilayah Anda.
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama bucket. Contoh: examplebucket.
bucketName := "examplebucket"
// Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt.
objectName := "exampledir/exampleobject.txt"
// Tentukan path lengkap file lokal. Contoh: D:\\localpath\\examplefile.txt.
filepath := "D:\\localpath\\examplefile.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Otorisasi pihak ketiga untuk mengunggah file menggunakan STS.
err = bucket.PutObjectFromFile(objectName, filepath)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("upload success")
}Node.js
Contoh pada langkah ini bergantung pada axios. Instal terlebih dahulu sebelum menjalankan kode.
const axios = require("axios");
const OSS = require("ali-oss");
// Gunakan kredensial sementara untuk menginisialisasi klien OSS di sisi klien demi akses berotorisasi sementara ke sumber daya OSS.
const getToken = async () => {
// Atur alamat untuk klien meminta kredensial akses.
await axios.get("http://localhost:8000/sts").then((token) => {
const client = new OSS({
// yourRegion menentukan wilayah bucket. Contoh untuk Tiongkok (Hangzhou): oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
// Tentukan ID AccessKey sementara dan Rahasia AccessKey yang Anda peroleh di Langkah 1 Sublangkah 5. Jangan gunakan ID AccessKey dan Rahasia AccessKey Akun Alibaba Cloud.
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
// Tentukan token keamanan yang Anda peroleh di Langkah 1 Sublangkah 5.
stsToken: token.data.SecurityToken,
authorizationV4: true,
// Tentukan nama bucket.
bucket: "examplebucket",
// Segarkan kredensial sementara.
refreshSTSToken: async () => {
const refreshToken = await axios.get("http://localhost:8000/sts");
return {
accessKeyId: refreshToken.data.AccessKeyId,
accessKeySecret: refreshToken.data.AccessKeySecret,
stsToken: refreshToken.data.SecurityToken,
};
},
});
// Gunakan kredensial sementara untuk mengunggah file.
// Tentukan path lengkap objek, tidak termasuk nama bucket. Contoh: exampleobject.jpg.
// Tentukan path lengkap file lokal. Contoh: D:\\example.jpg.
client.put('exampleobject.jpg', 'D:\\example.jpg').then((res)=>{console.log(res)}).catch(e=>console.log(e))
});
};
getToken()PHP
<?php
if (is_file(__DIR__ . 'autoload.php')) {
require_once __DIR__ . 'autoload.php';
}
if (is_file(__DIR__ . '/vendor/autoload.php')) {
require_once __DIR__ . '/vendor/autoload.php';
}
use OSS\Credentials\StaticCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
try {
// Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token keamanan yang Anda peroleh di Langkah 1 Sublangkah 5. Jangan gunakan kredensial identitas RAM user.
// Perhatikan bahwa ID AccessKey yang diperoleh dari layanan STS dimulai dengan "STS".
$accessKeyId = 'yourSTSAccessKeyID';
$accessKeySecret = 'yourSTSAccessKeySecret';
// Tentukan token keamanan yang Anda peroleh dari STS.
$securityToken = 'yourSecurityToken';
// Buat penyedia kredensial menggunakan kelas StaticCredentialsProvider.
$provider = new StaticCredentialsProvider($accessKeyId, $accessKeySecret, $securityToken);
// Tentukan endpoint wilayah bucket. Contoh untuk Tiongkok (Hangzhou): https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan nama bucket. Contoh: examplebucket.
$bucket= "examplebucket";
// Tentukan nama objek yang akan diunggah ke bucket.
$object = "exampletest.txt";
// Tentukan path file lokal yang akan diunggah. Contoh: D:\\localpath\\exampletest.txt.
$localFilePath = "D:\\localpath\\exampletest.txt";
// Anda dapat mengatur header terkait selama pengunggahan, seperti mengatur izin akses ke private dan menentukan metadata kustom.
$options = array(
OssClient::OSS_HEADERS => array(
'x-oss-object-acl' => 'private',
'x-oss-meta-info' => 'yourinfo'
),
);
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
// Tentukan wilayah bucket. Contoh untuk Tiongkok (Hangzhou): cn-hangzhou.
"region" => "cn-hangzhou"
);
// Buat klien OSS menggunakan informasi yang telah dikonfigurasi.
$ossClient = new OssClient($config);
// Kirim permintaan untuk mengunggah file lokal exampletest.txt ke examplebucket.
$ossClient->putObject($bucket, $object, $localFilePath, $options);
} catch (OssException $e) {
printf($e->getMessage() . "\n");
return;
}Ruby
require 'aliyun/sts'
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Endpoint wilayah Tiongkok (Hangzhou) digunakan dalam contoh ini. Tentukan endpoint sesuai wilayah Anda.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Tentukan ID AccessKey sementara dan Rahasia AccessKey yang Anda peroleh di Langkah 1 Sublangkah 5. Jangan gunakan ID AccessKey dan Rahasia AccessKey Akun Alibaba Cloud.
access_key_id: 'token.access_key_id',
access_key_secret: 'token.access_key_secret',
# Tentukan token keamanan yang Anda peroleh di Langkah 1 Sublangkah 5.
sts_token: 'token.security_token'
)
# Tentukan nama bucket. Contoh: examplebucket.
bucket = client.get_bucket('examplebucket')
# Unggah file.
bucket.put_object('exampleobject.txt', :file => 'D:\test.txt')FAQ
Error otorisasi
Nilai DurationSeconds tidak valid
Token keamanan tidak valid
AccessKeyId tidak ada
Akses anonim dilarang
Error NoSuchBucket
Error ACL bucket
Error kebijakan pemberi otorisasi
Error endpoint salah
Mendapatkan beberapa kredensial
Error format waktu salah
Menangani kode error 0003-0000301
Referensi
Untuk mempelajari cara membatasi ukuran file, jenis file, atau path unggah saat menggunakan kredensial STS yang dikeluarkan server untuk unggah sisi klien, lihat Ikhtisar.
Setelah mengotorisasi unggah file ke OSS dengan kredensial sementara STS, Anda dapat menggunakan URL yang ditandatangani untuk berbagi file dengan pihak ketiga guna pratinjau atau unduh. Untuk informasi selengkapnya, lihat Gunakan URL yang ditandatangani untuk mengunduh atau mempratinjau file.

