Topik ini menjelaskan cara menggunakan kredensial akses sementara yang disediakan oleh Security Token Service (STS) atau URL yang ditandatangani untuk mengakses sementara sumber daya Object Storage Service (OSS).
Penting Periode validitas harus ditentukan untuk kredensial akses sementara STS dan URL yang ditandatangani. Saat menggunakan kredensial akses sementara untuk menghasilkan URL yang ditandatangani, seperti untuk unggah dan unduh objek, periode validitas minimum berlaku. Sebagai contoh, Anda dapat menetapkan periode validitas kredensial akses sementara menjadi 1.200 detik dan periode validitas URL yang ditandatangani menjadi 3.600 detik. Dalam hal ini, URL yang ditandatangani tidak dapat digunakan untuk mengunggah objek setelah kredensial akses sementara STS kedaluwarsa, meskipun URL tersebut masih dalam periode validitasnya.
Gunakan STS untuk otorisasi akses sementara
Untuk mengakses OSS menggunakan kredensial akses sementara yang disediakan oleh STS, ikuti langkah-langkah berikut:
Langkah 1: Buat Pengguna RAM
Langkah 2: Berikan Izin AssumeRole kepada Pengguna RAM
Langkah 3: Buat Peran untuk Mendapatkan Kredensial Akses Sementara dari STS
Langkah 4: Berikan Peran Izin untuk Mengunggah dan Mengunduh Objek di OSS
Izinkan peran RAM untuk mengunduh dan mengunggah objek dengan melampirkan kebijakan kustom ke peran RAM.
Di halaman Create Policy, klik JSON. Ubah skrip di editor kebijakan untuk memberikan peran izin mengunggah dan mengunduh objek dari bucket bernama examplebucket. Contoh kode berikut menunjukkan cara memberikan izin kepada peran.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:PutObject",
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:examplebucket",
"acs:oss:*:*:examplebucket/*"
]
}
]
}
Langkah 5: Hasilkan Kredensial Akses Sementara Menggunakan STS
Penting Untuk menggunakan modul express, pastikan modul tersebut telah diinstal. Jika belum diinstal, jalankan perintah npm install express --save untuk menginstalnya.
const { STS } = require('ali-oss');
const express = require("express");
const app = express();
app.get('/sts', (req, res) => {
let sts = new STS({
// Tentukan pasangan AccessKey dari pengguna RAM yang dibuat di Langkah 1.
accessKeyId: 'yourAccessKeyId',
accessKeySecret: 'yourAccessKeySecret'
});
// Tentukan ARN dari peran RAM yang diperoleh di Langkah 2. Contoh: acs:ram::175708322470****:role/ramtest.
// Tentukan kebijakan kustom untuk membatasi izin dari kredensial akses sementara. Jika Anda tidak menentukan kebijakan kustom, kredensial akses sementara memiliki izin penuh dari peran RAM yang ditentukan.
Izin yang diperoleh oleh kredensial akses sementara adalah irisan dari izin peran yang dikonfigurasi di Langkah 4 dan izin yang ditentukan oleh kebijakan RAM kustom.
// Tentukan periode validitas dari kredensial akses sementara. Unit: detik. Periode validitas minimum dari kredensial akses sementara adalah 900 detik. Periode validitas maksimum dari kredensial akses sementara adalah durasi sesi maksimum yang ditentukan untuk peran saat ini. Dalam contoh ini, expiration diatur menjadi 3.000 detik.
// Tentukan nama sesi peran kustom, yang digunakan untuk membedakan token yang berbeda. Contoh: sessiontest.
sts.assumeRole('acs:ram::175708322470****:role/ramtest', ``, '3000', '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")
})
Langkah 6: Gunakan Kredensial Akses Sementara untuk Mengunggah dan Mengunduh Objek di OSS
Gunakan kredensial akses sementara untuk mengunggah objek ke OSS
Catatan Dalam contoh berikut, axios diperlukan. Unduh axios sebelum menjalankan kode sampel berikut.
const axios = require("axios");
const OSS = require("ali-oss");
// Gunakan kredensial akses sementara untuk menginisialisasi instance OSSClient. Instance ini digunakan untuk mengotorisasi akses sementara ke sumber daya OSS.
const getToken = async () => {
// Tentukan alamat yang digunakan oleh klien untuk mendapatkan kredensial akses sementara.
await axios.get("http://localhost:8000/sts").then((token) => {
const client = new OSS({
// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
stsToken: token.data.SecurityToken,
authorizationV4: true,
// Tentukan nama bucket.
bucket: "examplebucket",
// Perbarui kredensial akses sementara.
refreshSTSToken: async () => {
const refreshToken = await axios.get("http://localhost:8000/sts");
return {
accessKeyId: refreshToken.AccessKeyId,
accessKeySecret: refreshToken.AccessKeySecret,
stsToken: refreshToken.SecurityToken,
};
},
});
// Gunakan kredensial akses sementara untuk mengunggah objek ke OSS.
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampleobject.jpg.
// Tentukan jalur 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()
Gunakan kredensial akses sementara untuk mengunduh objek dari OSS
const axios = require("axios");
const OSS = require("ali-oss");
// Gunakan kredensial akses sementara untuk menginisialisasi instance OSSClient. Instance ini digunakan untuk mengotorisasi akses sementara ke sumber daya OSS.
const getToken = async () => {
// Tentukan alamat yang digunakan oleh klien untuk mendapatkan kredensial akses sementara.
await axios.get("http://localhost:8000/sts").then((token) => {
const client = new OSS({
// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
stsToken: token.data.SecurityToken,
authorizationV4: true,
// Tentukan nama bucket.
bucket: "examplebucket",
// Perbarui kredensial akses sementara.
refreshSTSToken: async () => {
const refreshToken = await axios.get("http://localhost:8000/sts");
return {
accessKeyId: refreshToken.AccessKeyId,
accessKeySecret: refreshToken.AccessKeySecret,
stsToken: refreshToken.SecurityToken,
};
},
});
// Gunakan kredensial akses sementara untuk mengunduh objek dari OSS.
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampleobject.jpg.
// Tentukan jalur lengkap file lokal. Contoh: D:\\example.jpg.
client.get('exampleobject.jpg', 'D:\\example.jpg').then((res)=>{console.log(res)}).catch(e=>console.log(e))
});
};
getToken()
Gunakan URL yang ditandatangani untuk otorisasi akses sementara
Catatan penggunaan
Ketika menggunakan OSS SDK untuk menghasilkan URL yang ditandatangani, OSS SDK menggunakan algoritma tertentu dan informasi kunci yang disimpan di komputer lokal untuk menghitung tanda tangan dan menambahkan tanda tangan ke URL guna memastikan validitas dan keamanannya. Operasi ini diselesaikan di klien tanpa perlu mengirim permintaan ke server melalui jaringan. Dengan cara ini, Anda tidak perlu memberikan izin tertentu kepada pemanggil saat menghasilkan URL yang ditandatangani. Namun, untuk mengizinkan pengguna pihak ketiga melakukan operasi terkait pada sumber daya yang diotorisasi oleh URL yang ditandatangani, pastikan entitas yang memanggil API memiliki izin yang sesuai.
Sebagai contoh, jika suatu entitas ingin mengunggah objek menggunakan URL pra-tandatangan, berikan izin oss:PutObject kepada entitas tersebut. Jika entitas ingin mengunduh atau melihat pratinjau objek menggunakan URL pra-tandatangan, berikan izin oss:GetObject kepada entitas tersebut.
Anda dapat menghasilkan URL pra-tandatangan dan menyediakannya kepada pengunjung untuk akses sementara. Saat menghasilkan URL pra-tandatangan, tentukan periode validitas URL untuk membatasi waktu akses pengunjung ke data tertentu.
URL pra-tandatangan yang dihasilkan menggunakan kode sampel berikut mungkin berisi tanda tambah (+). Ganti tanda tambah (+) di URL dengan %2B. Jika tidak, URL pra-tandatangan mungkin tidak dapat digunakan untuk mengakses objek sesuai harapan.
Hasilkan URL yang ditandatangani yang mencakup parameter IMG
const OSS = require('ali-oss');
const store = new OSS({
// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: 'yourRegion',
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// Tentukan nama bucket.
bucket: 'examplebucket'
})
// Dapatkan URL yang ditandatangani yang digunakan untuk memproses gambar bernama exampleobject.png.
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap.
let url = store.signatureUrl('exampleobject.png', {
process: 'image/resize,w_200' // Konfigurasikan parameter IMG yang digunakan untuk memproses gambar.
});
console.log(url);
// Dapatkan URL yang ditandatangani yang digunakan untuk memproses gambar exampleobject.png dan tentukan periode validitas URL.
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap.
let url = store.signatureUrl('exampleobject.png', {
// Tentukan periode validitas URL yang ditandatangani. Secara default, periode validitas adalah 1.800 detik.
expires: 3600,
// Konfigurasikan parameter IMG yang digunakan untuk memproses gambar.
process: 'image/resize,w_200'
});
console.log(url);
Hasilkan URL yang ditandatangani yang mencakup parameter versionId
const OSS = require('ali-oss');
const client = new OSS({
// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: 'yourRegion',
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// Tentukan nama bucket.
bucket: 'examplebucket'
})
// Hasilkan URL yang ditandatangani yang mencakup parameter ID versi.
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: example.png.
console.log(
client.signatureUrl('example.jpg', {
subResource: {
// Tentukan ID versi objek.
versionId: 'CAEQMBiBgIDW7duIqxgiIDA4OWRiYmFlZDUxMDQ3YzM4OWUyNjQzMzAzMDhj****',
},
})
)
Hasilkan URL yang ditandatangani dan gunakan URL yang ditandatangani untuk mengunggah file
const OSS = require("ali-oss");
const { default: axios } = require("axios");
const fs = require("fs");
const client = new OSS({
// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: 'yourregion',
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// Tentukan nama bucket.
bucket: 'examplebucket',
});
// Hasilkan URL yang ditandatangani untuk objek.
const url = client.signatureUrl("examplefile.txt", {
method: "PUT",
"Content-Type": "application/x-www-form-urlencoded",
});
// Tentukan jalur lengkap file lokal.
const file = fs.readFileSync("D:\\localpath\\examplefile.txt");
// Gunakan URL yang ditandatangani untuk mengunggah file lokal.
axios({
url,
method: "PUT",
data: file,
})
.then((r) => console.log(r))
.catch((e) => console.log(e));
Hasilkan URL yang ditandatangani dan gunakan URL yang ditandatangani untuk mengunduh objek
const { default: axios } = require("axios");
const fs = require("fs");
const client = new OSS({
// Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
region: 'yourRegion',
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// Tentukan nama bucket.
bucket: 'examplebucket'
});
// Hasilkan URL yang ditandatangani untuk objek.
const url = client.signatureUrl("examplefile.txt");
// Gunakan URL yang ditandatangani untuk mengunduh objek ke jalur lokal penuh yang ditentukan.
const file = "D:\\localpath\\examplefile.txt";
axios({
url,
method: "GET",
})
.then((r) => {
fs.writeFile(file, r.data, (err) => {
if (err) {
console.log(err);
}
});
})
.catch((e) => console.log(e));
Tanya Jawab Umum
Apakah saya bisa menggunakan metode POST untuk menghasilkan URL yang ditandatangani?
Tidak, Anda tidak dapat menggunakan metode POST untuk menghasilkan URL yang ditandatangani. Anda hanya dapat menggunakan metode PUT dan GET untuk menghasilkan URL yang ditandatangani. Jika ingin mengunggah objek menggunakan metode POST, buat permintaan POST. Untuk informasi lebih lanjut, lihat PostObject.