このトピックでは、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には次の利点があります。
一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 このトークンのアクセス権限と有効期間を指定できます。
有効期間が終了すると、トークンは自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の手順を実行します。
ステップ1: RAMユーザーの作成
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。
[ユーザー] ページで、ユーザーの作成 をクリックします。
ログイン名 および [表示名] パラメーターを設定します。
アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。
プロンプトに従って完全なセキュリティ検証。
AccessKeyペア (AccessKey IDとAccessKey secret) をコピーします。
重要RAMユーザーのAccessKeyシークレットは、RAMユーザーを作成する場合にのみ取得できます。 認証情報の漏洩を防ぐため、AccessKeyシークレットを安全に保持する必要があります。
ステップ2: RAMユーザーにAssumeRole権限を付与する
[ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。
[権限付与] パネルの [ポリシー] セクションで、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。
説明AliyunSTSAssumeRoleAccessポリシーを使用すると、RAMユーザーはAssumeRole操作を呼び出すことができます。 ポリシーの権限は、RAMユーザーがSTSから一時的なアクセス資格情報を取得してOSSへのリクエストを開始するために必要な権限とは無関係です。
[権限付与] をクリックします。
ステップ3: STSから一時的なアクセス資格情報を取得するために使用するロールを作成する
左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。
ロールの作成 をクリックします。 [ロールの作成] ウィザードの [ロールタイプの選択] ステップで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。
ロールの作成 ウィザードの [ロールの設定] ステップで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択 を 現在の Alibaba Cloud アカウント に設定します。
[OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索アイコンをクリックし、検索結果で [RamOssTest] をクリックします。
RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。
手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与する
カスタムポリシーをRAMロールにアタッチすることで、RAMロールがオブジェクトをダウンロードおよびアップロードできるようにします。
左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。
ポリシー ページで ポリシーの作成 をクリックします。
[ポリシーの作成] ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを変更して、examplebucketという名前のバケットにオブジェクトをアップロードしたり、バケットからオブジェクトをダウンロードしたりする権限をロールに付与します。 次のサンプルコードは、ロールに権限を付与する方法の例を示しています。
警告以下の例は参考情報です。 ユーザーに過度の権限を付与しないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:examplebucket", "acs:oss:*:*:examplebucket/*" ] } ] }
[次へ] をクリックしてポリシー情報を編集します。
[基本情報] セクションで、[名前] を [RamTestPolicy] に設定し、[OK] をクリックします。
カスタムポリシーをRamOssTestロールにアタッチします。
左側のナビゲーションペインで、[ID] > [ロール] を選択します。
[ロール] ページで、[RamOssTest] ロールを見つけます。
[操作] の [権限付与] をクリックします。
[権限付与] パネルで、[ポリシー] セクションのドロップダウンリストから [カスタムポリシー] を選択し、[RamTestPolicy] ポリシーを選択します。
[権限付与] をクリックします。
ステップ5: STSを使用して一時的なアクセス資格情報を生成する
一時的なアクセス資格情報には、セキュリティトークンと一時的なAccessKeyペアが含まれます。 AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。 一時的なアクセス資格情報の有効期間は秒単位です。 一時的なアクセス資格情報の最小有効期間は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 = new STS({
// Specify the AccessKey pair of the RAM user that was created in Step 1.
accessKeyId: 'yourAccessKeyId',
accessKeySecret: 'yourAccessKeySecret'
});
// Specify the ARN of the RAM role that was obtained in Step 2. Example: acs:ram::175708322470****:role/ramtest.
// Specify a custom policy to limit the permissions of the temporary access credentials. If you do not specify a custom policy, the temporary access credentials have full permissions of the specified RAM role.
The permissions obtained by the temporary access credentials are the intersection of the role permissions configured in Step 4 and the permissions specified by the custom RAM policy.
// Specify the validity period of the temporary access credentials. Unit: seconds. The minimum validity period of the temporary access credentials is 900 seconds. The maximum validity period of the temporary access credentials is the maximum session duration specified for the current role. In this example, expiration is set to 3,000 seconds.
// Specify a custom role session name, which is used to distinguish different tokens. Example: 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")
})
手順6: 一時的なアクセス資格情報を使用して、OSSへのオブジェクトのアップロードとOSSからのオブジェクトのダウンロード
一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする
説明次の例では、axiossが必要です。 次のサンプルコードを実行する前にaxiossをダウンロードしてください。
const axios = require("axios"); const OSS = require("ali-oss"); // Use the temporary access credentials to initialize an OSSClient instance. The instance is used to authorize temporary access to OSS resources. const getToken = async () => { // Specify the address that is used by the client to obtain the temporary access credentials. await axios.get("http://localhost:8000/sts").then((token) => { const client = new OSS({ // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou. region: 'oss-cn-hangzhou', accessKeyId: token.data.AccessKeyId, accessKeySecret: token.data.AccessKeySecret, stsToken: token.data.SecurityToken, authorizationV4: true, // Specify the name of the bucket. bucket: "examplebucket", // Refresh the temporary access credentials. refreshSTSToken: async () => { const refreshToken = await axios.get("http://localhost:8000/sts"); return { accessKeyId: refreshToken.AccessKeyId, accessKeySecret: refreshToken.AccessKeySecret, stsToken: refreshToken.SecurityToken, }; }, }); // Use the temporary access credentials to upload objects to OSS. // Specify the full path of the object. Do not include the bucket name in the full path. Example: exampleobject.jpg. // Specify the full path of the local file. Example: D:\\example.jpg. client.put('exampleobject.jpg', 'D:\\example.jpg').then((res)=>{console.log(res)}).catch(e=>console.log(e)) }); }; getToken()
一時的なアクセス資格情報を使用してOSSからオブジェクトをダウンロードする
const axios = require("axios"); const OSS = require("ali-oss"); // Use the temporary access credentials to initialize an OSSClient instance. The instance is used to authorize temporary access to OSS resources. const getToken = async () => { // Specify the address that is used by the client to obtain the temporary access credentials. await axios.get("http://localhost:8000/sts").then((token) => { const client = new OSS({ // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou. region: 'oss-cn-hangzhou', accessKeyId: token.data.AccessKeyId, accessKeySecret: token.data.AccessKeySecret, stsToken: token.data.SecurityToken, authorizationV4: true, // Specify the name of the bucket. bucket: "examplebucket", // Refresh the temporary access credentials. refreshSTSToken: async () => { const refreshToken = await axios.get("http://localhost:8000/sts"); return { accessKeyId: refreshToken.AccessKeyId, accessKeySecret: refreshToken.AccessKeySecret, stsToken: refreshToken.SecurityToken, }; }, }); // Use the temporary access credentials to download objects from OSS. // Specify the full path of the object. Do not include the bucket name in the full path. Example: exampleobject.jpg. // Specify the full path of the local file. Example: 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によって承認されたリソースに対して関連する操作を実行できるようにするには、API操作を呼び出して署名付き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({
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou.
region: 'yourRegion',
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// Specify the name of the bucket.
bucket: 'examplebucket'
})
// Obtain the signed URL that is used to process an image named exampleobject.png.
// Specify the full path of the object. Do not include the bucket name in the full path.
let url = store.signatureUrl('exampleobject.png', {
process: 'image/resize,w_200' // Configure IMG parameters used to process the image.
});
console.log(url);
// Obtain the signed URL used to process the exampleobject.png image and specify the validity period of the URL.
// Specify the full path of the object. Do not include the bucket name in the full path.
let url = store.signatureUrl('exampleobject.png', {
// Specify the validity period of the signed URL. By default, the validity period is 1,800 seconds.
expires: 3600,
// Configure IMG parameters used to process the image.
process: 'image/resize,w_200'
});
console.log(url);
versionIdパラメーターを含む署名付きURLの生成
const OSS = require('ali-oss');
const client = new OSS({
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou.
region: 'yourRegion',
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// Specify the name of the bucket.
bucket: 'examplebucket'
})
// Generate a signed URL that includes the version ID parameter.
// Specify the full path of the object. Do not include the bucket name in the full path. Example: example.png.
console.log(
client.signatureUrl('example.jpg', {
subResource: {
// Specify the version ID of the object.
versionId: 'CAEQMBiBgIDW7duIqxgiIDA4OWRiYmFlZDUxMDQ3YzM4OWUyNjQzMzAzMDhj****',
},
})
)
署名付きURLを生成し、署名付きURLを使用してファイルをアップロード
const OSS = require("ali-oss");
const { default: axios } = require("axios");
const fs = require("fs");
const client = new OSS({
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou.
region: 'yourregion',
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// Specify the name of the bucket.
bucket: 'examplebucket',
});
// Generate a signed URL for the object.
const url = client.signatureUrl("examplefile.txt", {
method: "PUT",
"Content-Type": "application/x-www-form-urlencoded",
});
// Specify the full path of the local file.
const file = fs.readFileSync("D:\\localpath\\examplefile.txt");
// Use the signed URL to upload the local file.
axios({
url,
method: "PUT",
data: file,
})
.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({
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou.
region: 'yourRegion',
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// Specify the name of the bucket.
bucket: 'examplebucket'
});
// Generate a signed URL for the object.
const url = client.signatureUrl("examplefile.txt");
// Use the signed URL to download the object to the specified full local path.
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));
よくある質問
POSTメソッドを使用して署名付きURLを生成できますか?
いいえ、POSTメソッドを使用して署名付きURLを生成することはできません。 署名付きURLを生成するには、PUTメソッドとGETメソッドのみを使用できます。 POSTメソッドを使用してオブジェクトをアップロードする場合は、POSTリクエストを作成する必要があります。 詳細は、「PostObject」をご参照ください。