Layanan Token Keamanan (Security Token Service/STS) memungkinkan Anda memberikan akses berdurasi terbatas ke resource OSS tanpa mengekspos pasangan AccessKey permanen Anda. Saat kredensial sementara kedaluwarsa, akses akan secara otomatis dicabut.
Gunakan kredensial sementara berbasis STS ketika Anda perlu:
Memberikan pihak ketiga (seperti pemasok atau mitra) akses berdurasi terbatas ke bucket OSS Anda tanpa membagikan kredensial permanen Anda
Mengontrol izin secara dinamis — berikan hanya operasi spesifik yang dibutuhkan pihak ketiga, dan sesuaikan atau cabut akses seiring perubahan kebutuhan
Menghindari pengelolaan kredensial jangka panjang untuk pihak eksternal
OSS juga mendukung URL yang ditandatangani (presigned URLs) untuk akses sementara. Gunakan STS ketika Anda memerlukan kontrol izin berbasis role dan manajemen akses dinamis. Gunakan presigned URLs ketika Anda perlu membagikan objek tertentu melalui URL berdurasi terbatas.
Cara kerja
Alur ini melibatkan tiga pihak: perusahaan (pemilik Akun Alibaba Cloud), STS, dan pemasok (pihak ketiga).
Perusahaan menyiapkan Pengguna RAM dan Peran RAM, lalu memberikan izin OSS yang diperlukan kepada peran tersebut.
Pemasok meminta kredensial sementara dari server aplikasi perusahaan.
Server aplikasi memanggil
AssumeRolemenggunakan kredensial Pengguna RAM untuk mendapatkan kredensial sementara dari STS.STS mengembalikan kredensial sementara — ID AccessKey, Rahasia AccessKey, dan token STS — beserta waktu kedaluwarsa.
Pemasok menggunakan kredensial sementara tersebut untuk mengunggah data ke bucket OSS.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Bucket OSS yang sudah ada. Lihat Membuat bucket
Langkah 1: Konfigurasi sisi perusahaan
Perusahaan melakukan penyiapan berikut satu kali untuk memungkinkan pemasok meminta kredensial sementara.
1.1 Buat Pengguna RAM
Pengguna RAM mewakili server aplikasi Anda — ia memanggil STS untuk menghasilkan kredensial sementara atas nama perusahaan.
Masuk ke RAM consoleRAM consoleRAM consoleRAM consoleRAM console.
Di panel navigasi kiri, pilih Identities > Users.
Klik Create User.
Tentukan Logon Name dan Display Name.
Di bawah Access Mode, pilih Using permanent AccessKey to access, lalu klik OK.
Lengkapi verifikasi keamanan sesuai permintaan.
Salin ID AccessKey dan Rahasia AccessKey, lalu simpan dengan aman.
Rahasia AccessKey hanya ditampilkan sekali saat pembuatan. Unduh file CSV segera dan simpan di lokasi yang aman.

1.2 Berikan izin kepada Pengguna RAM untuk memanggil AssumeRole
Di RAM console, pilih Identities > Users.
Temukan Pengguna RAM yang telah Anda buat dan klik Add Permissions di kolom Actions.
Di panel Grant permissions, pilih kebijakan AliyunSTSAssumeRoleAccess.
Klik Grant permissions.
AliyunSTSAssumeRoleAccess hanya mengizinkan Pengguna RAM untuk memanggil AssumeRole. Kebijakan ini tidak memberikan akses OSS — akses tersebut berasal dari Peran RAM yang akan Anda buat selanjutnya.
1.3 Buat Peran RAM
Peran RAM menentukan apa yang dapat dilakukan oleh kredensial sementara. Kredensial sementara pemasok mewarisi izin dari peran tersebut.
Di RAM console, pilih Identities > Roles.
Klik Create Role.
Atur Principal Type menjadi Cloud Account dan Principal Name menjadi Current Account, lalu klik OK.

Di dialog Create Role, tentukan nama peran dan klik OK.
Di halaman detail peran, klik Copy di samping bidang ARN pada bagian Basic Information. Simpan ARN tersebut — Anda akan membutuhkannya saat memanggil AssumeRole.

1.4 Berikan izin unggah OSS kepada Peran RAM
Lampirkan kebijakan ke Peran RAM yang hanya memberikan izin yang dibutuhkan pemasok.
Create a custom policy:
Di RAM console, pilih Permissions > Policies.
Klik Create Policy.
Klik JSON dan masukkan kebijakan berikut, yang mengizinkan pengunggahan objek ke bucket tertentu:
PeringatanContoh ini memberikan akses unggah luas ke seluruh bucket. Untuk penggunaan produksi, batasi
Resourceke direktori tertentu. Lihat Contoh umum kebijakan RAM.oss:PutObjectmencakup unggah simple, unggah form, unggah append, unggah multi-bagian, dan unggah yang dapat dilanjutkan. Untuk operasi lainnya, lihat Elemen Action dalam kebijakan RAM untuk OSS.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }Klik OK. Di dialog tersebut, masukkan nama kebijakan (misalnya,
RamTestPolicy), lalu klik OK.
Lampirkan kebijakan ke Peran RAM:
Di RAM console, pilih Identities > Roles.
Temukan peran
RamOssTest, lalu klik Grant Permission pada kolom Tindakan.Di bagian Policy, pilih Custom Policy dari dropdown jenis, lalu pilih
RamTestPolicy.Klik Grant permissions.
1.5 Hasilkan kredensial sementara
Server aplikasi memanggil AssumeRole menggunakan pasangan AccessKey Pengguna RAM (dari langkah 1.1) untuk mendapatkan kredensial sementara dari STS.
Gunakan pasangan AccessKey Pengguna RAM — bukan kredensial Akun Alibaba Cloud. Memanggil STS dengan kredensial Akun Alibaba Cloud akan gagal.
Semua contoh di bawah membaca kredensial dari variabel lingkungan dan menggunakan ARN Peran RAM dari langkah 1.3. Kredensial yang dikembalikan mencakup ID AccessKey (diawali dengan STS.), Rahasia AccessKey, token STS, dan waktu kedaluwarsa.
Contoh respons:
{
"AccessKeyId": "STS.****************",
"AccessKeySecret": "3dZn*******************************************",
"SecurityToken": "CAIS*****************************************************************************************************************************************",
"Expiration": "2024-**-*****:**:50Z"
}Waktu kedaluwarsa dalam UTC. Misalnya, 2024-04-18T11:33:40Z berarti 18 April 2024 pukul 19:33:40 (UTC+8).Akun Alibaba Cloud, bersama Pengguna RAM dan Peran RAM-nya, dapat mengirim hingga 100 permintaan per detik (RPS) ke STS. Dalam skenario konkurensi tinggi, gunakan kembali kredensial hingga kedaluwarsa alih-alih meminta kredensial baru untuk setiap operasi.
Periode validitas:
| Skenario | Minimum | Maksimum |
|---|---|---|
| Durasi sesi maksimum peran default (3.600 detik) | 900 detik | 3.600 detik |
| Durasi sesi maksimum peran kustom | 900 detik | Hingga 43.200 detik |
Tentukan periode validitas yang cukup panjang untuk operasi Anda. Untuk mengunggah file besar atau menjalankan tugas yang memakan waktu, gunakan durasi yang lebih lama agar kredensial tidak perlu direfresh di tengah operasi.
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) {
// Titik akhir STS — gunakan yang berada di wilayah yang sama dengan server aplikasi Anda untuk respons lebih cepat
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
// Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
String accessKeyId = System.getenv("ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ACCESS_KEY_SECRET");
// Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
String roleArn = System.getenv("RAM_ROLE_ARN");
// Label untuk mengidentifikasi sesi ini — berguna untuk auditing
String roleSessionName = "yourRoleSessionName";
// null berarti kredensial sementara mewarisi semua izin peran
String policy = null;
// Periode validitas dalam detik (min: 900, maks: durasi sesi maksimum peran, maks default: 3.600)
Long durationSeconds = 3600L;
try {
String regionId = "";
// Untuk STS SDK for Java V3.12.0 dan yang lebih baru:
DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
// Untuk STS SDK for Java sebelum V3.12.0:
// DefaultProfile.addEndpoint("", regionId, "Sts", endpoint);
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
// Untuk STS SDK for Java V3.12.0 dan yang lebih baru:
request.setSysMethod(MethodType.POST);
// Untuk STS SDK for Java sebelum V3.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
# Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
access_key_id = os.getenv("ACCESS_KEY_ID")
access_key_secret = os.getenv("ACCESS_KEY_SECRET")
# Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
role_arn = os.getenv("RAM_ROLE_ARN")
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)
# Label untuk mengidentifikasi sesi ini
request.add_query_param('RoleSessionName', 'sessiontest')
# Periode validitas: 3.600 detik
request.add_query_param('DurationSeconds', '3600')
request.set_accept_format('JSON')
body = clt.do_action_with_exception(request)
token = json.loads(oss2.to_unicode(body))
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({
// Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
accessKeyId: process.env.ACCESS_KEY_ID,
accessKeySecret: process.env.ACCESS_KEY_SECRET
});
// Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
// Argumen kedua adalah kebijakan inline opsional untuk membatasi izin lebih lanjut
// Periode validitas: 3.600 detik (min: 900)
// Label untuk mengidentifikasi sesi ini
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() {
// Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
accessKeyId := os.Getenv("ACCESS_KEY_ID")
accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")
// Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
roleArn := os.Getenv("RAM_ROLE_ARN")
config := &openapi.Config{
AccessKeyId: tea.String(accessKeyId),
AccessKeySecret: tea.String(accessKeySecret),
}
// Titik akhir STS — lihat https://api.alibabacloud.com/product/Sts untuk semua titik akhir
config.Endpoint = tea.String("sts.cn-hangzhou.aliyuncs.com")
client, err := sts20150401.NewClient(config)
if err != nil {
fmt.Printf("Failed to create client: %v\n", err)
return
}
request := &sts20150401.AssumeRoleRequest{
// Periode validitas: 3.600 detik
DurationSeconds: tea.Int64(3600),
RoleArn: tea.String(roleArn),
// Label untuk mengidentifikasi sesi ini
RoleSessionName: tea.String("examplename"),
}
response, err := client.AssumeRoleWithOptions(request, &util.RuntimeOptions{})
if err != nil {
fmt.Printf("Failed to assume role: %v\n", err)
return
}
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;
// Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
$accessKeyId = getenv("ACCESS_KEY_ID");
$accessKeySecret = getenv("ACCESS_KEY_SECRET");
// Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
$roleArn = getenv("RAM_ROLE_ARN");
AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
->regionId('cn-hangzhou')
->asDefaultClient();
try {
$result = Sts::v20150401()
->assumeRole()
->withRoleArn($roleArn)
// Label untuk mengidentifikasi sesi ini
->withRoleSessionName('sessiontest')
// Periode validitas: 3.600 detik
->withDurationSeconds(3600)
->request();
$credentials = $result['Credentials'];
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) {
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
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'
set :public_folder, File.dirname(__FILE__) + '/templates'
def get_sts_token_for_oss_upload()
client = RPCClient.new(
// Baca kredensial Pengguna RAM dari variabel lingkungan (dibuat di langkah 1.1)
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: {
// Baca ARN Peran RAM dari variabel lingkungan (dibuat di langkah 1.3)
"RoleArn": ENV['RAM_ROLE_ARN'],
// Periode validitas: 3.600 detik
"DurationSeconds": 3600,
// Label untuk mengidentifikasi sesi ini
"RoleSessionName": "sessiontest"
},
opts: {
method: 'POST',
format_params: true
}
)
end
$server_ip = "127.0.0.1" // Untuk mendengarkan alamat IP lain, terapkan autentikasi di sisi server
$server_port = 8000
if ARGV.length == 1
$server_port = ARGV[0]
elsif ARGV.length == 2
$server_ip = ARGV[0]
$server_port = ARGV[1]
end
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')
endUntuk bahasa lainnya, lihat Ikhtisar STS SDK.
Izin tingkat granularitas tinggi (opsional)
Secara default, kredensial sementara memiliki semua izin dari Peran RAM. Untuk membatasinya lebih lanjut — misalnya, hanya mengizinkan unggah ke direktori tertentu — berikan kebijakan inline dalam permintaan AssumeRole. Izin akhir merupakan irisan antara izin peran dan kebijakan inline.
// Kebijakan ini membatasi kredensial sementara hanya untuk mengunggah objek ke direktori src/.
// Izin akhir = izin peran (langkah 1.4) irisan kebijakan inline ini
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 data menggunakan kredensial sementara
Mulai 20 Maret 2025, pengguna OSS baru harus menggunakan nama domain kustom (CNAME) untuk melakukan operasi API data pada bucket OSS di wilayah Tiongkok Daratan. Titik akhir publik default dibatasi untuk operasi ini. Lihat pengumuman resmi untuk daftar lengkap operasi yang terdampak. Jika Anda mengakses data melalui HTTPS, ikat Sertifikat SSL yang valid ke domain kustom Anda — ini wajib untuk akses Konsol OSS.
Inisialisasi klien OSS dengan kredensial sementara (ID AccessKey, Rahasia AccessKey, dan token STS) dari langkah 1.5. ID AccessKey sementara diawali dengan STS..
Untuk bahasa lainnya, lihat Ikhtisar.
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 {
// Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
// ID AccessKey sementara diawali dengan STS.
String accessKeyId = "yourSTSAccessKeyID";
String accessKeySecret = "yourSTSAccessKeySecret";
String stsToken = "yourSecurityToken";
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Gunakan signature V4
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
// Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
// ID wilayah, misalnya, cn-hangzhou
.region("region")
.build();
try {
// Unggah exampletest.txt ke examplebucket
PutObjectRequest putObjectRequest = new PutObjectRequest(
"examplebucket",
"exampletest.txt",
new File("D:\\localpath\\exampletest.txt")
);
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Kesalahan OSS — permintaan mencapai OSS tetapi ditolak:");
System.out.println("Pesan Kesalahan: " + oe.getErrorMessage());
System.out.println("Kode Kesalahan: " + oe.getErrorCode());
System.out.println("ID Permintaan: " + oe.getRequestId());
System.out.println("ID Host: " + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Kesalahan klien — tidak dapat mencapai OSS:");
System.out.println("Pesan Kesalahan: " + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}Python
OSS SDK untuk Python tersedia dalam dua versi. Versi 2.0 merupakan penulisan ulang lengkap dari 1.0 dengan autentikasi yang disederhanakan, logika retry, dan penanganan kesalahan, serta opsi konfigurasi yang lebih fleksibel.
Contoh V2
import alibabacloud_oss_v2 as oss
def main():
// Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
// ID AccessKey sementara diawali dengan STS.
sts_access_key_id = 'yourSTSAccessKeyID'
sts_access_key_secret = 'yourSTSAccessKeySecret'
sts_security_token = 'yourSecurityToken'
credentials_provider = oss.credentials.StaticCredentialsProvider(
access_key_id=sts_access_key_id,
access_key_secret=sts_access_key_secret,
security_token=sts_security_token,
)
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
// Wilayah tempat bucket berada, misalnya, cn-hangzhou
cfg.region = 'cn-hangzhou'
client = oss.Client(cfg)
// Unggah file lokal ke examplebucket
local_file_path = 'D:\\localpath\\exampletest.txt'
with open(local_file_path, 'rb') as file:
data = file.read()
result = client.put_object(oss.PutObjectRequest(
bucket='examplebucket',
key='exampletest.txt',
body=data,
))
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},'
)
if __name__ == "__main__":
main()Contoh V1
# -*- coding: utf-8 -*-
import oss2
# Titik akhir wilayah tempat bucket berada, misalnya https://oss-cn-hangzhou.aliyuncs.com
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial pengguna RAM
sts_access_key_id = 'yourAccessKeyId'
sts_access_key_secret = 'yourAccessKeySecret'
bucket_name = 'examplebucket'
object_name = 'examplebt.txt'
security_token = 'yourSecurityToken'
auth = oss2.StsAuth(sts_access_key_id, sts_access_key_secret, security_token)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
result = bucket.put_object(object_name, "hello world")
print(result.status)Go
OSS SDK untuk Go tersedia dalam dua versi. Versi 2.0 merupakan penulisan ulang lengkap dari 1.0 dengan autentikasi yang disederhanakan, logika retry, dan penanganan kesalahan, serta opsi konfigurasi yang lebih fleksibel.
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() {
// Wilayah tempat bucket berada, misalnya, cn-hangzhou
region := "cn-hangzhou"
// Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
// ID AccessKey sementara diawali dengan STS.
accessKeyID := "yourSTSAccessKeyID"
accessKeySecret := "yourSTSAccessKeySecret"
stsToken := "yourSecurityToken"
provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret, stsToken)
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(provider).
WithRegion(region)
client := oss.NewClient(cfg)
localFile := "D:\\localpath\\exampletest.txt"
putRequest := &oss.PutObjectRequest{
Bucket: oss.Ptr("examplebucket"),
Key: oss.Ptr("exampletest.txt"),
StorageClass: oss.StorageClassStandard,
Acl: oss.ObjectACLPrivate,
Metadata: map[string]string{
"yourMetadataKey1": "yourMetadataValue1",
},
}
result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
if err != nil {
log.Fatalf("failed to put object from file %v", err)
}
log.Printf("put object from file result:%#v\n", result)
}Contoh V1
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// Baca kredensial sementara dari variabel lingkungan
// Atur OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN sebelum menjalankan
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
bucketName := "examplebucket"
objectName := "exampledir/exampleobject.txt"
filepath := "D:\\localpath\\examplefile.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
err = bucket.PutObjectFromFile(objectName, filepath)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("upload success")
}Node.js
Contoh ini memerlukan Axios.
const axios = require("axios");
const OSS = require("ali-oss");
const getToken = async () => {
// Ambil kredensial sementara dari server aplikasi (menjalankan langkah 1.5)
await axios.get("http://localhost:8000/sts").then((token) => {
const client = new OSS({
// Wilayah tempat bucket berada, misalnya, oss-cn-hangzhou
region: 'oss-cn-hangzhou',
// Gunakan kredensial sementara dari langkah 1.5
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
stsToken: token.data.SecurityToken,
authorizationV4: true,
bucket: "examplebucket",
// Secara otomatis refresh kredensial sebelum kedaluwarsa
refreshSTSToken: async () => {
const refreshToken = await axios.get("http://localhost:8000/sts");
return {
accessKeyId: refreshToken.data.AccessKeyId,
accessKeySecret: refreshToken.data.AccessKeySecret,
stsToken: refreshToken.data.SecurityToken,
};
},
});
// Unggah objek menggunakan kredensial sementara
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 {
// Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
// ID AccessKey sementara diawali dengan STS.
$accessKeyId = 'yourSTSAccessKeyID';
$accessKeySecret = 'yourSTSAccessKeySecret';
$securityToken = 'yourSecurityToken';
$provider = new StaticCredentialsProvider($accessKeyId, $accessKeySecret, $securityToken);
// Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket = "examplebucket";
$object = "exampletest.txt";
$localFilePath = "D:\\localpath\\exampletest.txt";
$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,
// Wilayah tempat bucket berada, misalnya, cn-hangzhou
"region" => "cn-hangzhou"
);
$ossClient = new OssClient($config);
$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(
// Titik akhir wilayah tempat bucket berada, misalnya, https://oss-cn-hangzhou.aliyuncs.com
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
// Gunakan kredensial sementara dari langkah 1.5 — bukan kredensial Pengguna RAM
access_key_id: 'token.access_key_id',
access_key_secret: 'token.access_key_secret',
sts_token: 'token.security_token'
)
bucket = client.get_bucket('examplebucket')
bucket.put_object('exampleobject.txt', :file => 'D:\test.txt')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 Tiongkok Daratan. 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.
FAQ
"You are not authorized to do this action. You should be authorized by RAM"
"The Min/Max value of DurationSeconds is 15min/1hr"
"The security token you provided is invalid"
"The OSS Access Key Id you provided does not exist in our records"
"AccessDenied: Anonymous access is forbidden for this operation"
NoSuchBucket
"You have no right to access this object because of bucket acl"
"Access denied by authorizer's policy"
"The bucket you are attempting to access must be addressed using the specified endpoint"
Can I hold multiple sets of temporary credentials at the same time?
Time format error
Error 0003-0000301
Langkah selanjutnya
Unggah langsung dari klien: Izinkan klien mengunggah langsung ke OSS menggunakan kredensial sementara, dengan kondisi unggah seperti batas ukuran file, jenis file yang diizinkan, dan direktori tujuan. Lihat Unggahan klien langsung.
Bagikan objek yang diunggah: Hasilkan URL yang ditandatangani untuk membagikan objek yang diunggah menggunakan kredensial sementara. Lihat Menggunakan URL yang ditandatangani untuk mengunduh atau melihat pratinjau file.

