このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースに一時的にアクセスする方法について説明します。
重要 STSの一時アクセス資格情報と署名付きURLに有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、STSの一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。
STS を使用した一時的アクセス許可
STSを使用して、OSSへの一時アクセスを許可できます。 STSは、ユーザーに一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、STSとは何ですか?.
STSには次の利点があります。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の手順を実行します。
ステップ1: RAMユーザーの作成
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、 > [ユーザー] を選択します。
[ユーザー] ページで、ユーザーの作成 をクリックします。
ログイン名 および [表示名] パラメーターを設定します。
アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。
プロンプトに従って完全なセキュリティ検証。
RAMユーザーのAccessKeyペアをコピーします。
ステップ2: RAMユーザーにAssumeRole権限を付与する
[ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。
権限の追加 パネルで、[システムポリシー] タブをクリックし、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。
説明 RAMユーザーには、STSのAssumeRole操作を呼び出すためのAliyunSTSAssumeRoleAccessポリシーがアタッチされています。 AliyunSTSAssumeRoleAccessポリシーの権限は、一時的なアクセス資格情報を取得し、一時的なアクセス資格情報を使用してOSSリクエストを開始するために必要な権限とは無関係です。
[OK] をクリックします。
ステップ3: STSから一時的なアクセス資格情報を取得するために使用するロールを作成する
左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。
ロールの作成 をクリックします。 [ロールの作成] パネルで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。
ロールの作成 パネルで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択 を 現在の Alibaba Cloud アカウント に設定します。
[OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索結果で [RamOssTest] をクリックします。
RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。
手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与する
カスタムポリシーをRAMロールにアタッチすることで、RAMロールがオブジェクトをダウンロードおよびアップロードできるようにします。
左側のナビゲーションウィンドウで、 > を選択します。
ポリシー ページで ポリシーの作成 をクリックします。
[ポリシーの作成] ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを変更して、examplebucketという名前のバケットにオブジェクトをアップロードしたり、バケットからオブジェクトをダウンロードしたりする権限をロールに付与します。 次のサンプルコードは、ロールに権限を付与する方法の例を示しています。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"OSS:のputObject"、
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:examplebucket" 、
"acs:oss:*:*:examplebucket/*"
]
}
]
}
[次へ] をクリックしてポリシー情報を編集します。
[基本情報] セクションで、[名前] を [RamTestPolicy] に設定し、[OK] をクリックします。
カスタムポリシーをRamOssTestロールにアタッチします。
左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。
[ロール] ページで、[RamOssTest] ロールを見つけます。
RamOssTestロールの [操作] 列で、[権限付与] をクリックします。
[権限付与] パネルで、[カスタムポリシー] タブをクリックし、[RamTestPolicy] ポリシーを選択します。
[OK] をクリックします。
ステップ5: STSを使用して一時的なアクセス資格情報を生成する
一時的なアクセス資格情報には、セキュリティトークンと、AccessKey IDとAccessKeyシークレットで構成される一時的なAccessKeyペアが含まれます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。
重要 次のサンプルコードを実行する前に、モジュールがインストールされていることを確認してください。 モジュールがインストールされていない場合は、npm install express -- saveコマンドを実行してモジュールをインストールします。
const { STS } = require('ali-oss ');
const express = require("express");
const app = express();
app.get('/sts', (req, res) => {
let sts=新しいSTS({
// 手順1で作成したRAMユーザーのAccessKeyペアを指定します。
accessKeyId: 'yourAccessKeyId' 、
accessKeySecret: 'yourAccessKeySecret'
});
// 手順2で作成したRAMロールのARNを指定します。 例: acs:ram::175708322470 ****:role/ramtest。
// カスタムポリシーを指定して、一時的なアクセス資格情報の権限を制限します。 カスタムポリシーを指定しない場合、一時的なアクセス資格情報には、指定されたRAMロールの完全な権限が付与されます。
一時的なアクセス資格情報によって取得される権限は、手順4で設定されたロール権限とカスタムRAMポリシーで指定された権限の共通部分です。
// expirationは、一時的なアクセス資格情報の有効期間を指定します。 単位は秒です。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 この例では、有効期限は3,000秒に設定されています。
// sessionNameは、さまざまなトークンを区別するために使用されるカスタムロールセッション名を指定します。 例: sessiontest。
sts.assumeRole('acs:ram::175708322470 ****:role/ramtest', '', '3000', 'sessiontest').then((result) => {
console.log (結果);
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,
有効期限: result.credentials。有効期限
});
}).catch((err) => {
console.log(err);
res.status(400).json(err.message);
});
});
app.listen(8000,()=>{
console.log("server listen on:8000")
})
手順6: 一時的なアクセス資格情報を使用して、OSSへのオブジェクトのアップロードとOSSからのオブジェクトのダウンロード
一時的なアクセス資格情報を使用したオブジェクトのアップロード
constaxios=require("axios");
const OSS = require("ali-oss");
// 一時的なアクセス資格情報を使用して、OSSClientインスタンスを初期化します。 インスタンスは、OSSリソースへの一時アクセスを許可するために使用されます。
const getToken = async () => {
// クライアントが一時的なアクセス資格情報を取得するために使用するアドレスを指定します。
await axios.get("http:// localhost:8000/sts").then((トークン) => {
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'oss-cn-hangzhou' 、
accessKeyId: token.data.AccessKeyId、
accessKeySecret: token.data.AccessKeySecret、
stsToken: token.data.SecurityToken、
// バケットの名前を指定します。
bucket: "examplebucket" 、
// 一時的なアクセス資格情報を更新します。
refreshSTSToken: async () => {
const refreshToken = await axios.get("http:// localhost:8000/sts");
return {
accessKeyId: refreshToken.AccessKeyId、
accessKeySecret: refreshToken.AccessKeySecret、
stsToken: refreshToken.SecurityToken,
};
},
});
// 一時的なアクセス資格情報を使用して、オブジェクトをOSSにアップロードします。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampleobject.jpg。
// ローカルファイルのフルパスを指定します。 例: D :\\ example.jpg
client.put('exampleobject.jpg ', 'D :\\ example.jpg').then((res)=>{ console.log(res)}).catch(e=>console.log(e))
});
};
getToken()
一時的なアクセス資格情報を使用してOSSからオブジェクトをダウンロードする
constaxios=require("axios");
const OSS = require("ali-oss");
// 一時的なアクセス資格情報を使用して、OSSClientインスタンスを初期化します。 インスタンスは、OSSリソースへの一時アクセスを許可するために使用されます。
const getToken = async () => {
// クライアントが一時的なアクセス資格情報を取得するために使用するアドレスを指定します。
await axios.get("http:// localhost:8000/sts").then((トークン) => {
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'oss-cn-hangzhou' 、
accessKeyId: token.data.AccessKeyId、
accessKeySecret: token.data.AccessKeySecret、
stsToken: token.data.SecurityToken、
// バケットの名前を指定します。
bucket: "examplebucket" 、
// 一時的なアクセス資格情報を更新します。
refreshSTSToken: async () => {
const refreshToken = await axios.get("http:// localhost:8000/sts");
return {
accessKeyId: refreshToken.AccessKeyId、
accessKeySecret: refreshToken.AccessKeySecret、
stsToken: refreshToken.SecurityToken,
};
},
});
// 一時的なアクセス資格情報を使用して、OSSからオブジェクトをダウンロードします。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampleobject.jpg。
// ローカルファイルのフルパスを指定します。 例: D :\\ example.jpg
client.get('exampleobject.jpg ', 'D :\\ example.jpg').then((res)=>{ console.log(res)}).catch(e=>console.log(e))
});
};
getToken()
一時的なアクセス許可に署名付きURLを使用する
使用上の注意
OSS SDKを使用して署名付きURLを生成する場合、OSS SDKは特定のアルゴリズムとローカルコンピューターに保存されているキー情報を使用して署名を計算し、URLに署名を追加してURLの有効性とセキュリティを確保します。 署名を計算し、URLを構築するために実行される操作は、クライアント上で完了する。 ネットワーク経由でサーバーにリクエストを送信する必要はありません。 したがって、署名付きURLを生成するために特定の権限を付与する必要はありません。 ただし、サードパーティのユーザーが署名付きURLで承認された操作を実行できないようにするには、操作を実行するための対応するアクセス許可が必要です。
たとえば、プリンシパルが署名付きURLを使用してオブジェクトをアップロードする場合は、プリンシパルにoss:PutObject権限を付与する必要があります。 プリンシパルが署名付きURLを使用してオブジェクトをダウンロードまたはプレビューする場合は、プリンシパルにoss:GetObject権限を付与する必要があります。
署名付きURLを生成し、一時的なアクセスのために訪問者にURLを提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が特定のデータにアクセスできる期間を制限できます。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を % 2B
に置き換えます。 そうでない場合、署名付きURLを使用してオブジェクトにアクセスすることはできません。
IMGパラメーターを含む署名付きURLの生成
const OSS = require('ali-OSS ');
const store = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket'
})
// exampleobject.pngという名前のイメージを処理するために使用される署名付きURLを取得します。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。
let url = store.signatureUrl('exampleobject.png ', {
process: 'image/resize,w_200 '// イメージの処理に使用するIMGパラメーターを設定します。
});
console.log(url);
// exampleobject.pngイメージの処理に使用される署名付きURLを取得し、URLの有効期間を指定します。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。
let url = store.signatureUrl('exampleobject.png ', {
// 署名付きURLの有効期間を指定します。 デフォルトでは、有効期間は1,800秒です。
有効期限: 3600、
// イメージの処理に使用するIMGパラメーターを設定します。
プロセス: 'image/resize,w_200'
});
console.log(url);
versionIdパラメーターを含む署名付きURLの生成
const OSS = require('ali-OSS ');
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket'
})
// バージョンIDパラメーターを含む署名付きURLを生成します。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: example.png.
console.log (
client.signatureUrl('example.jpg ', {
subResource: {
// オブジェクトのバージョンIDを指定します。
versionId: 'CAEQMBiBgIDW7duIqxgiIDA4OWRiYmFlZDUxMDQ3YzM4OWUyNjQzMzAzMDhj **** ',
},
})
)
署名付きURLを生成し、署名付きURLを使用してファイルをアップロード
const OSS = require("ali-oss");
const { default: axios } = require("axios");
const fs = require("fs");
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
region: 'yourregion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket' 、});
// オブジェクトの署名付きURLを生成します。
const url = client.signatureUrl("examplefile.txt", {
メソッド: "PUT" 、
"Content-Type": "application/x-www-form-urlencoded" 、});
// ローカルファイルのフルパスを指定します。
constファイル=fs.readFileSync("D :\\ localpath\\examplefile.txt");
// 署名付きURLを使用して、ローカルファイルをアップロードします。
axios({
url,
メソッド: "PUT" 、
data: ファイル、})
. then((r) => console.log(r))
. catch((e) => console.log(e));
署名付きURLを生成し、署名付きURLを使用してオブジェクトをダウンロード
const { default: axios } = require("axios");
const fs = require("fs");
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket'
});
// オブジェクトの署名付きURLを生成します。
const url = client.signatureUrl("examplefile.txt");
// 署名付きURLを使用して、指定された完全ローカルパスにオブジェクトをダウンロードします。
constファイル="D :\\ localpath\\examplefile.txt";
axios({
url,
メソッド: "GET" 、})
. then((r) => {
fs.writeFile (ファイル, r.data, (err) => {
if(err){
console.log(err);
}
});
})
. catch((e) => console.log(e));
よくある質問
POSTメソッドを使用して署名付きURLを生成できますか?
いいえ、POSTメソッドを使用して署名付きURLを生成することはできません。 署名付きURLを生成するには、PUTメソッドとGETメソッドのみを使用できます。 POSTメソッドを使用してオブジェクトをアップロードする場合は、POSTリクエストを作成する必要があります。 詳細は、「PostObject」をご参照ください。