Layanan Security Token Service (STS) memungkinkan Anda memberikan akses berbatas waktu ke data yang disimpan di Object Storage Service (OSS) dengan menggunakan kredensial sementara. Setelah kedaluwarsa, kredensial tersebut tidak dapat lagi digunakan untuk mengakses data, sehingga menyediakan kontrol akses yang fleksibel dan berbatas waktu.
Use case
Sebuah perusahaan e-commerce menyimpan sejumlah besar data produknya di OSS. Seorang pemasok perusahaan tersebut perlu secara rutin mengunggah data dari sistem bisnisnya sendiri ke bucket OSS milik perusahaan.
Perusahaan memiliki persyaratan keamanan informasi dan kepatuhan berikut:
Keamanan data: Untuk mencegah akses tidak sah terhadap data bisnis intinya, perusahaan tidak ingin mengekspos pasangan AccessKey OSS-nya kepada pemasok.
Kontrol izin: Perusahaan memerlukan kontrol izin detail halus. Secara spesifik, perusahaan ingin memberi otorisasi kepada pemasok untuk mengunggah data dan dapat menyesuaikan izin tersebut secara dinamis sesuai perubahan kebutuhan.
Manajemen izin: Perusahaan ingin secara fleksibel menghasilkan kredensial akses untuk pemasok dan mitra masa depan, tanpa harus mengelola kredensial jangka panjang.
Akses berbatas waktu: Perusahaan ingin memberikan akses berbatas waktu kepada pemasok. Ketika periode waktu yang ditentukan berakhir, pemasok akan ditolak aksesnya ke data tersebut.
How it works
Perusahaan memberi otorisasi kepada pemasok untuk sementara mengunggah file ke bucket OSS.
Perusahaan mulai dengan membuat pengguna Resource Access Management (RAM) dan peran RAM, lalu memberikan izin yang diperlukan. Pemasok meminta kredensial sementara dari perusahaan, yang kemudian memanggil operasi AssumeRole untuk menghasilkan kredensial sementara dan mengembalikannya kepada pemasok. Pemasok menggunakan kredensial sementara tersebut untuk mengunggah data ke bucket OSS milik perusahaan.
Prasyarat
Perusahaan telah memiliki bucket OSS. Untuk informasi selengkapnya, lihat Buat bucket.
Langkah 1: Pembuatan kredensial sementara oleh perusahaan
1. Buat pengguna RAM
Pemilik akun Alibaba Cloud atau pengguna RAM dengan hak istimewa administratif dapat membuat pengguna RAM.
Masuk ke Konsol RAM.
Di panel navigasi sebelah kiri, pilih Identities > Users.
Pada halaman Users, klik Create User.
Tentukan Logon Name dan Display Name.
Pada bagian Access Mode, pilih Using permanent AccessKey to access dan klik OK.
Ikuti petunjuk pada layar untuk menyelesaikan verifikasi keamanan.
Salin pasangan AccessKey (ID AccessKey dan Rahasia AccessKey) dan simpan ke file lokal yang aman.
PentingAnda hanya dapat memperoleh Rahasia AccessKey pengguna RAM saat membuat pengguna RAM tersebut. Unduh file CSV yang berisi pasangan AccessKey ke lokasi aman di perangkat Anda.

2. Berikan otorisasi kepada pengguna RAM untuk memanggil operasi AssumeRole
Perusahaan kemudian menggunakan akun Alibaba Cloud atau pengguna RAM yang memiliki hak istimewa administrasi RAM untuk memberikan izin kepada pengguna RAM yang dibuat agar dapat memanggil operasi AssumeRole.
Masuk ke Konsol RAM.
Di panel navigasi sebelah kiri, pilih Identities > Users. Temukan pengguna RAM yang telah Anda buat sebelumnya dan klik Add Permissions di kolom Actions.
Pada bagian Policy di panel Grant Permission, pilih kebijakan AliyunSTSAssumeRoleAccess.
CatatanKebijakan AliyunSTSAssumeRoleAccess memungkinkan pengguna RAM memanggil operasi AssumeRole. Kebijakan ini tidak memberikan izin yang diperlukan oleh pengguna RAM untuk memperoleh kredensial sementara dari STS dan menginisiasi permintaan ke OSS.

Klik Grant permissions.
3. Buat peran RAM
Perusahaan menggunakan akun Alibaba Cloud-nya atau pengguna RAM yang memiliki hak istimewa administrasi RAM untuk membuat peran RAM dengan mengikuti langkah-langkah berikut:
Masuk ke Konsol RAM.
Di panel navigasi sebelah kiri, pilih Identities > Roles.
Pada halaman Roles, klik Create Role.
Pada halaman Create Role, pilih Cloud Account untuk Principal Type, pilih Current Account untuk Principal Name, lalu klik OK.

Pada kotak dialog Create Role, tentukan nama peran dan klik OK.
Pada halaman detail peran yang muncul, klik Copy di sebelah bidang ARN pada bagian Basic Information.

4. Berikan izin kepada peran RAM untuk mengunggah objek ke OSS
Untuk memberikan akses peran RAM ke OSS, perusahaan perlu menyambungkan satu atau beberapa kebijakan ke peran RAM tersebut dengan menggunakan akun Alibaba Cloud atau sebagai pengguna RAM yang memiliki hak istimewa administrasi RAM. Misalnya, peran RAM memerlukan izin tulis OSS untuk mengunggah data ke bucket yang ditentukan.
Buat kebijakan kustom untuk memberikan izin mengunggah objek kepada peran tersebut.
Masuk ke Konsol RAM.
Di panel navigasi sebelah kiri, pilih Permissions > Policies.
Pada halaman Policies, klik Create Policy.
Pada halaman Create Policy, klik JSON. Di editor kode, masukkan izin untuk mengunggah data ke bucket yang ditentukan. Skrip berikut menyediakan contoh kebijakan:
PeringatanContoh berikut hanya disediakan sebagai referensi. Anda perlu mengonfigurasi kebijakan RAM detail halus berdasarkan kebutuhan Anda untuk menghindari pemberian izin berlebihan. Untuk informasi selengkapnya tentang cara mengonfigurasi kebijakan RAM detail halus, lihat Contoh 9: Gunakan RAM atau STS untuk memberi otorisasi pengguna mengakses sumber daya OSS.
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }CatatanElemen Action menentukan izin yang ingin Anda berikan kepada peran RAM. Misalnya, jika Anda menentukan oss:PutObject, pengguna RAM yang mengasumsikan peran RAM tersebut dapat mengunggah objek ke bucket yang ditentukan dengan menggunakan berbagai metode unggah, seperti unggah simple, unggah form, unggah append, unggah multi-bagian, dan unggah yang dapat dilanjutkan. Untuk informasi selengkapnya, lihat Elemen Action dalam kebijakan RAM untuk OSS.
Klik OK. Pada kotak dialog Create Policy, tentukan nama kebijakan di bidang Policy Name (RamTestPolicy dalam contoh ini), lalu klik OK.
Sambungkan kebijakan kustom ke peran RamOssTest untuk memberikan izin.
Masuk ke Konsol RAM.
Di panel navigasi sebelah kiri, pilih Identities > Roles.
Pada halaman Roles, temukan peran RamOssTest.
Klik Grant Permission di kolom Actions.
Pada bagian Policy di halaman Grant Permission, pilih Custom Policy dari daftar drop-down tipe, lalu pilih kebijakan kustom RamTestPolicy.
Klik Grant permissions.
5. Gunakan pengguna RAM untuk mengasumsikan peran RAM guna menghasilkan kredensial sementara
Memanggil API STS dengan pasangan AccessKey akun Alibaba Cloud akan gagal. Anda harus menggunakan pasangan AccessKey pengguna RAM. Kode contoh berikut menggunakan pasangan AccessKey pengguna RAM untuk meminta kredensial sementara.
Pengguna RAM yang dibuat sebelumnya mengasumsikan peran RAM untuk memperoleh kredensial sementara. Kredensial sementara mencakup token STS (SecurityToken), pasangan AccessKey sementara (ID AccessKey dan Rahasia AccessKey), serta periode validitas (Expiration). Kode contoh berikut menghasilkan kredensial sementara yang menyediakan izin
oss:PutObjectyang diperlukan untuk unggah simple. Untuk informasi selengkapnya tentang cara menggunakan SDK STS untuk bahasa pemrograman lain guna menghasilkan kredensial sementara, lihat Ikhtisar SDK STS.Titik akhir dalam kode contoh menentukan titik akhir STS. Titik akhir STS yang berada di wilayah yang sama atau dekat dengan server aplikasi dapat meningkatkan kecepatan respons STS. Untuk informasi tentang titik akhir STS, lihat Titik akhir.
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) {
// Tentukan titik akhir STS. Contoh: sts.cn-hangzhou.aliyuncs.com. Anda dapat mengakses STS melalui Internet atau virtual private cloud (VPC).
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
// Peroleh ID AccessKey dan Rahasia AccessKey pengguna RAM yang dihasilkan di Langkah 1.1 dari variabel lingkungan.
String accessKeyId = System.getenv("ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ACCESS_KEY_SECRET");
// Peroleh ARN peran RAM yang dihasilkan di Langkah 1.3 dari variabel lingkungan.
String roleArn = System.getenv("RAM_ROLE_ARN");
// Tentukan nama sesi peran kustom untuk membedakan token yang berbeda. Contoh: SessionTest.
String roleSessionName = "yourRoleSessionName";
// Tentukan bahwa kredensial sementara memiliki semua izin peran RAM.
String policy = null;
// Tentukan periode validitas kredensial sementara. Satuan: detik. Periode validitas minimum adalah 900 detik. Periode validitas maksimum sama dengan durasi sesi maksimum yang ditentukan untuk peran saat ini. Durasi sesi maksimum peran saat ini berkisar antara 3.600 hingga 43.200 detik. Durasi sesi maksimum default peran saat ini adalah 3.600 detik.
// Dalam kasus penggunaan unggah objek besar atau lainnya yang memakan waktu, atur periode validitas yang sesuai untuk menghindari pemanggilan berulang operasi API STS guna memperoleh kredensial sementara sebelum tugas selesai.
Long durationSeconds = 3600L;
try {
// Tentukan wilayah STS. Pertahankan nilai default. Nilai default adalah string kosong ("").
String regionId = "";
// Tentukan titik akhir. Baris berikut berlaku untuk SDK STS untuk Java V3.12.0 dan versi lebih baru.
DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
// Tentukan titik akhir. Baris berikut berlaku untuk SDK STS untuk Java versi sebelum V3.12.0.
// DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
// Buat profil default.
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
// Gunakan profil untuk membuat klien.
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
// Baris berikut berlaku untuk SDK STS untuk Java V3.12.0 dan versi lebih baru.
request.setSysMethod(MethodType.POST);
// Baris berikut berlaku untuk SDK STS untuk Java versi 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
# Peroleh ID AccessKey dan Rahasia AccessKey pengguna RAM yang dihasilkan di Langkah 1.1 dari variabel lingkungan.
access_key_id = os.getenv("ACCESS_KEY_ID")
access_key_secret = os.getenv("ACCESS_KEY_SECRET")
# Peroleh ARN peran RAM yang dihasilkan di Langkah 1.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 peran kustom untuk membedakan token yang berbeda. Contoh: sessiontest.
request.add_query_param('RoleSessionName', 'sessiontest')
# Atur periode validitas kredensial sementara menjadi 3.600 detik.
request.add_query_param('DurationSeconds', '3600')
request.set_accept_format('JSON')
body = clt.do_action_with_exception(request)
# Gunakan pasangan AccessKey pengguna RAM untuk mengajukan permohonan kredensial sementara dari STS.
token = json.loads(oss2.to_unicode(body))
# Tampilkan ID AccessKey, Rahasia AccessKey, token keamanan, dan waktu kedaluwarsa kredensial sementara 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 pengguna RAM yang dihasilkan di Langkah 1.1 dari variabel lingkungan.
accessKeyId : process.env.ACCESS_KEY_ID,
accessKeySecret : process.env.ACCESS_KEY_SECRET
});
// Peroleh ARN Peran RAM dari variabel lingkungan (dibuat di Langkah 1.3).
// Tentukan kebijakan kustom untuk membatasi izin kredensial sementara. Jika Anda tidak menentukan kebijakan kustom, kredensial sementara memiliki semua izin peran RAM yang ditentukan.
// Izin yang diperoleh kredensial sementara adalah irisan antara izin peran yang dikonfigurasi di Langkah 4 dan izin yang ditentukan oleh kebijakan RAM kustom.
// Tentukan periode validitas kredensial sementara. Satuan: detik. Periode validitas minimum kredensial sementara adalah 900 detik. Periode validitas maksimum kredensial sementara adalah durasi sesi maksimum yang ditentukan untuk peran saat ini. Dalam contoh ini, periode validitas diatur menjadi 3.600 detik.
// Tentukan nama sesi peran 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 pengguna RAM yang dihasilkan di Langkah 1.1 dari variabel lingkungan.
accessKeyId := os.Getenv("ACCESS_KEY_ID")
accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")
// Peroleh ARN peran RAM yang dihasilkan di Langkah 1.3 dari variabel lingkungan.
roleArn := os.Getenv("RAM_ROLE_ARN")
// Buat klien.
config := &openapi.Config{
// Berikan ID AccessKey yang diperoleh di Langkah 1.1.
AccessKeyId: tea.String(accessKeyId),
// Berikan Rahasia AccessKey yang diperoleh di Langkah 1.1.
AccessKeySecret: tea.String(accessKeySecret),
}
// Tentukan titik akhir wilayah tempat bucket berada. Untuk informasi selengkapnya, kunjungi https://api.alibabacloud.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 pasangan AccessKey pengguna RAM untuk mengajukan permohonan kredensial sementara dari STS.
request := &sts20150401.AssumeRoleRequest{
// Atur periode validitas kredensial sementara menjadi 3.600 detik.
DurationSeconds: tea.Int64(3600),
// Peroleh ARN peran RAM yang dihasilkan di Langkah 1.3 dari variabel lingkungan.
RoleArn: tea.String(roleArn),
// Tentukan nama sesi kustom.
RoleSessionName: tea.String("examplename"),
}
response, err := client.AssumeRoleWithOptions(request, &util.RuntimeOptions{})
if err != nil {
fmt.Printf("Gagal mengasumsikan peran: %v\n", err)
return
}
// Tampilkan ID AccessKey, Rahasia AccessKey, token keamanan, dan waktu kedaluwarsa kredensial sementara 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 pengguna RAM yang dihasilkan di Langkah 1.1 dari variabel lingkungan.
$accessKeyId = getenv("ACCESS_KEY_ID");
$accessKeySecret = getenv("ACCESS_KEY_SECRET");
// Peroleh ARN peran RAM yang dihasilkan di Langkah 1.3 dari variabel lingkungan.
$roleArn = getenv("RAM_ROLE_ARN");
// Inisialisasi klien Alibaba Cloud.
AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
->regionId('cn-hangzhou')
->asDefaultClient();
try {
// Buat permintaan untuk memperoleh kredensial sementara dari STS.
$result = Sts::v20150401()
->assumeRole()
// Tentukan ARN peran.
->withRoleArn($roleArn)
// Tentukan nama sesi kustom untuk peran guna membedakan token yang berbeda.
->withRoleSessionName('sessiontest')
// Atur periode validitas kredensial sementara menjadi 3.600 detik.
->withDurationSeconds(3600)
->request();
// Tampilkan informasi kredensial dalam tanggapan.
$credentials = $result['Credentials'];
// Tampilkan ID AccessKey, Rahasia AccessKey, token keamanan, dan waktu kedaluwarsa kredensial sementara 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 pengecualian klien.
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
// Tangani pengecualian 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 public-folder ke subfolder templates dalam 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 pengguna RAM yang dihasilkan di Langkah 1.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 peran RAM yang dihasilkan di Langkah 1.3 dari variabel lingkungan.
"RoleArn": ENV['RAM_ROLE_ARN'],
# Atur periode validitas kredensial sementara menjadi 3.600 detik.
"DurationSeconds": 3600,
# Tentukan nama sesi peran kustom, yang digunakan 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 IP lain, seperti 0.0.0.0, terapkan mekanisme autentikasi Anda di sisi server.
$server_port = 8000
puts "App server berjalan di: 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')
endContoh kredensial sementara
CatatanAkun Alibaba Cloud, bersama dengan pengguna RAM dan peran RAM-nya, dapat mengirim hingga 100 permintaan per detik (RPS) ke STS untuk meminta kredensial sementara. Gunakan kembali kredensial sementara dalam kasus penggunaan konkurensi tinggi.
Waktu kedaluwarsa kredensial sementara dalam format UTC. Misalnya, jika waktu kedaluwarsa adalah 2024-04-18T11:33:40Z, kredensial sementara kedaluwarsa pada 18 April 2024 pukul 19:33:40 (UTC+8).
{ "AccessKeyId": "STS.****************", "AccessKeySecret": "3dZn*******************************************", "SecurityToken": "CAIS*****************************************************************************************************************************************", "Expiration": "2024-**-*****:**:50Z" }
Izin detail halus untuk kredensial sementara
Setelah kredensial sementara memperoleh izin dari peran RAM, Anda dapat lebih lanjut membatasi izin kredensial sementara tersebut. Misalnya, jika kredensial sementara memiliki izin untuk mengunggah objek ke bucket examplebucket, tentukan bahwa kredensial akses hanya dapat digunakan untuk mengunggah data ke direktori tertentu dalam bucket tersebut. Kode contoh berikut membatasi izin kredensial sementara.
// Kebijakan berikut menentukan bahwa kredensial sementara hanya dapat digunakan untuk mengunggah objek ke direktori src bucket examplebucket. // Izin akhir yang diberikan kepada kredensial sementara adalah irisan antara izin peran yang ditentukan di Langkah 4 dan izin yang ditentukan dalam kebijakan. Hal ini memungkinkan pengunggahan data hanya ke direktori src dalam bucket 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: Pengunggahan data oleh pemasok menggunakan 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 terpengaruh. Jika Anda mengakses data melalui HTTPS, Anda harus mengikat Sertifikat SSL yang valid ke domain kustom Anda. Hal ini wajib untuk akses Konsol OSS, karena konsol menerapkan HTTPS.
Kode contoh berikut menunjukkan cara mengunggah data menggunakan kredensial sementara. Untuk informasi tentang cara mengunggah data ke OSS berdasarkan kredensial sementara dengan menggunakan SDK OSS untuk bahasa pemrograman lain, 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 {
// Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token STS yang dihasilkan di langkah 1.5. Jangan gunakan kredensial pengguna RAM.
// Perhatikan bahwa ID AccessKey yang disediakan oleh STS dimulai dengan STS.
String accessKeyId = "yourSTSAccessKeyID";
String accessKeySecret = "yourSTSAccessKeySecret";
// Tentukan token keamanan yang diperoleh dari STS.
String stsToken= "yourSecurityToken";
// Berikan ID AccessKey dan rahasia ke DefaultCredentialProvider untuk menginisialisasi penyedia kredensial.
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
// Gunakan credentialsProvider untuk menginisialisasi klien.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Nyatakan secara eksplisit penggunaan algoritma signature V4.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Buat instance OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya ketika OSSClient tidak lagi digunakan.
OSS ossClient = OSSClientBuilder.create()
// Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
// Tentukan ID wilayah. Contoh: cn-hangzhou.
.region("region")
.build();
try {
// Buat objek PutObjectRequest. Unggah file lokal exampletest.txt ke examplebucket.
PutObjectRequest putObjectRequest = new PutObjectRequest("examplebucket", "exampletest.txt", new File("D:\\localpath\\exampletest.txt"));
// Opsional. Tentukan kelas penyimpanan dan ACL objek.
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// Unggah objek.
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
+ "tetapi ditolak dengan tanggapan kesalahan karena suatu alasan.");
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("Terjadi ClientException, yang berarti klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Kesalahan:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Python
SDK OSS untuk Python tersedia dalam dua versi, 2.0 dan 1.0. SDK OSS untuk Python 2.0 merupakan penyusunan ulang lengkap dari versi 1.0, menyederhanakan operasi inti seperti autentikasi, pengulangan permintaan, dan penanganan kesalahan. SDK ini menawarkan konfigurasi parameter yang lebih fleksibel dan memperkenalkan fitur-fitur canggih baru. Contoh berikut disediakan untuk membantu Anda mengimplementasikan SDK OSS untuk Python berdasarkan kebutuhan aktual Anda.
OSS SDK untuk Python 2.0
import alibabacloud_oss_v2 as oss
def main():
# Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token STS yang dihasilkan di langkah 1.5. Jangan gunakan kredensial pengguna RAM.
# Perhatikan bahwa ID AccessKey yang disediakan oleh STS dimulai dengan STS.
sts_access_key_id = 'yourSTSAccessKeyID'
sts_access_key_secret = 'yourSTSAccessKeySecret'
# Tentukan token STS yang diperoleh dari STS.
sts_security_token = 'yourSecurityToken'
# Buat penyedia kredensial statis dan nyatakan secara eksplisit ID AccessKey, Rahasia AccessKey, dan token STS yang disediakan oleh STS.
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 tentukan penyedia kredensial.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah ke cn-hangzhou.
cfg.region = 'cn-hangzhou'
# Gunakan konfigurasi di atas untuk membuat instance OSSClient.
client = oss.Client(cfg)
# Tentukan path lengkap objek lokal yang ingin Anda unggah. 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 untuk mengunggah exampletest.txt ke examplebucket.
result = client.put_object(oss.PutObjectRequest(
# Nama bucket.
bucket='examplebucket',
# Nama objek yang akan diunggah.
key='exampletest.txt',
body=data,
))
# Tampilkan kode status HTTP, ID permintaan, hash MD5, ETag, nilai CRC-64, dan ID versi objek 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},'
)
# Panggil fungsi utama saat skrip dijalankan secara langsung.
if __name__ == "__main__":
main() # Titik masuk skrip. Saat skrip dijalankan secara langsung, fungsi utama dipanggil.OSS SDK untuk Python 1.0
# -*- coding: utf-8 -*-
import oss2
# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan ID AccessKey sementara dan Rahasia AccessKey yang dihasilkan di langkah 1.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 menggunakan string. Jangan sertakan nama bucket dalam path lengkap.
object_name = 'examplebt.txt'
# Masukkan token STS yang dihasilkan di Langkah 1.5.
security_token = 'yourSecurityToken'
# Inisialisasi instance StsAuth menggunakan 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
SDK OSS untuk Go tersedia dalam dua versi, 2.0 dan 1.0. SDK OSS untuk Go 2.0 merupakan penyusunan ulang lengkap dari versi 1.0, menyederhanakan operasi inti seperti autentikasi, pengulangan permintaan, dan penanganan kesalahan. SDK ini menawarkan konfigurasi parameter yang lebih fleksibel dan memperkenalkan fitur-fitur canggih baru. Contoh berikut disediakan untuk membantu Anda mengimplementasikan SDK OSS untuk Go berdasarkan kebutuhan aktual Anda.
OSS SDK untuk Go 2.0
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 tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah ke cn-hangzhou.
region := "cn-hangzhou"
// Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token STS yang dihasilkan di langkah 1.5. Jangan gunakan kredensial pengguna RAM.
// Perhatikan bahwa ID AccessKey yang disediakan oleh STS dimulai dengan STS.
accessKeyID := "yourSTSAccessKeyID"
accessKeySecret := "yourSTSAccessKeySecret"
// Tentukan token STS yang diperoleh dari STS.
stsToken := "yourSecurityToken"
// Gunakan metode NewStaticCredentialsProvider untuk menentukan ID AccessKey, Rahasia AccessKey, dan Token STS.
provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret, stsToken)
// Muat konfigurasi default SDK dan tentukan penyedia kredensial dan wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(provider).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Tentukan path file lokal yang ingin Anda unggah. 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.
StorageClass: oss.StorageClassStandard, // Atur kelas penyimpanan objek ke Standard.
Acl: oss.ObjectACLPrivate, // Atur ACL objek ke private.
Metadata: map[string]string{
"yourMetadataKey1": "yourMetadataValue1", // Konfigurasikan metadata objek.
},
}
// Jalankan permintaan untuk mengunggah exampletest.txt ke examplebucket.
result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
if err != nil {
log.Fatalf("gagal mengunggah objek dari file %v", err)
}
// Tampilkan hasil pengunggahan objek.
log.Printf("hasil unggah objek dari file:%#v\n", result)
}OSS SDK untuk Go 1.0
package main
import (
"fmt""github.com/aliyun/aliyun-oss-go-sdk/oss""os"
)
func main() {
// Peroleh kredensial sementara dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, dan OSS_SESSION_TOKEN telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat instance OSSClient. // Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Tentukan titik akhir aktual 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. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt.
objectName := "exampledir/exampleobject.txt"// Tentukan path lengkap objek lokal. Contoh: D:\\localpath\\examplefile.txt.
filepath := "D:\\localpath\\examplefile.txt"
bucket,err := client.Bucket(bucketName)
// Unggah file lokal menggunakan kredensial sementara.
err = bucket.PutObjectFromFile(objectName,filepath)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("upload success")
}Node.js
Kode contoh ini memerlukan Axios.
const axios = require("axios");
const OSS = require("ali-oss");
// Gunakan kredensial sementara untuk menginisialisasi instance OSSClient. Instance ini digunakan untuk memberi otorisasi akses sementara ke sumber daya OSS.
const getToken = async () => {
// Tentukan alamat yang digunakan klien untuk memperoleh kredensial sementara.
await axios.get("http://localhost:8000/sts").then((token) => {
const client = new OSS({
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
// Tentukan ID AccessKey sementara, Rahasia AccessKey, dan token STS yang dihasilkan di langkah 1.5. Jangan gunakan kredensial pengguna RAM.
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
// Masukkan token STS yang dihasilkan di Langkah 1.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 objek.
// Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampleobject.jpg.
// Tentukan path lengkap objek 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 STS yang dihasilkan di langkah 1.5. Jangan gunakan kredensial pengguna RAM.
// Perhatikan bahwa ID AccessKey yang disediakan oleh STS dimulai dengan STS.
$accessKeyId = 'yourSTSAccessKeyID';
$accessKeySecret = 'yourSTSAccessKeySecret';
// Tentukan token STS yang diperoleh dari STS.
$securityToken = 'yourSecurityToken';
// Buat penyedia kredensial menggunakan StaticCredentialsProvider.
$provider = new StaticCredentialsProvider($accessKeyId, $accessKeySecret, $securityToken);
// Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir ke 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.
$object = "exampletest.txt";
// Tentukan path lengkap objek lokal yang ingin Anda unggah. Contoh: D:\\localpath\\exampletest.txt.
$localFilePath = "D:\\localpath\\exampletest.txt";
// Konfigurasikan header dalam permintaan unggah untuk menentukan informasi tentang string yang diunggah. Misalnya, atur ACL objek ke private dan konfigurasikan metadata pengguna objek.
$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 tempat bucket berada. Misalnya, jika bucket Anda berada di wilayah Tiongkok (Hangzhou), atur wilayah ke cn-hangzhou.
"region" => "cn-hangzhou"
);
// Gunakan konfigurasi di atas untuk membuat instance OSSClient.
$ossClient = new OssClient($config);
// Kirim permintaan untuk mengunggah file lokal bernama 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(
# Dalam contoh ini, digunakan titik akhir wilayah Tiongkok (Hangzhou). Tentukan titik akhir aktual Anda.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Tentukan ID AccessKey sementara dan Rahasia AccessKey yang dihasilkan di langkah 1.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',
# Masukkan token STS yang dihasilkan di Langkah 1.5.
sts_token: 'token.security_token'
)
# Tentukan nama bucket. Contoh: examplebucket.
bucket = client.get_bucket('examplebucket')
# Unggah objek.
bucket.put_object('exampleobject.txt', :file => 'D:\test.txt')FAQ
Bagaimana cara memperbaiki kesalahan "You are not authorized to do this action. You should be authorized by RAM"?
Bagaimana cara memperbaiki kesalahan "The Min/Max value of DurationSeconds is 15min/1hr"?
Bagaimana cara memperbaiki kesalahan "The security token you provided is invalid"?
Bagaimana cara memperbaiki kesalahan "The OSS Access Key Id you provided does not exist in our records"?
Bagaimana cara memperbaiki kesalahan "AccessDenied: Anonymous access is forbidden for this operation"?
Bagaimana cara memperbaiki kesalahan NoSuchBucket?
Bagaimana cara memperbaiki kesalahan "You have no right to access this object because of bucket acl" saat saya mencoba menggunakan kredensial sementara untuk mengakses sumber daya OSS?
Bagaimana cara memperbaiki kesalahan "Access denied by authorizer's policy" saat saya menggunakan kredensial sementara yang diperoleh dari STS untuk melakukan operasi pada sumber daya OSS?
Bagaimana cara memperbaiki kesalahan "The bucket you are attempting to access must be addressed using the specified endpoint"?
Dapatkah saya memperoleh beberapa set kredensial sementara secara bersamaan?
Bagaimana cara memperbaiki kesalahan format waktu?
Bagaimana cara memperbaiki kesalahan 0003-0000301?
Referensi
Gunakan kredensial sementara untuk mengunggah data ke OSS langsung dari klien Anda dan tentukan kondisi unggah, seperti ukuran file, jenis file, dan direktori tujuan. Untuk informasi selengkapnya, lihat Unggahan klien langsung.
Gunakan URL yang ditandatangani untuk berbagi objek yang diunggah menggunakan kredensial sementara. Untuk informasi selengkapnya, lihat Menggunakan URL yang ditandatangani untuk mengunduh atau melihat pratinjau file.

