このトピックでは、Security Token Service (STS) と署名付きURLをそれぞれ使用して、Object Storage Service (OSS) への一時アクセスを許可する方法について説明します。
使用上の注意
一時アクセス資格情報と署名付きURLに有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、有効期間が短い方が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、署名付きURLが有効期間内であっても、一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTSを使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
STS を使用した一時的アクセス許可
STSを使用して、OSSへの一時アクセスを許可できます。 STSは、一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、「STSの概要」をご参照ください。
STSには次の利点があります。
一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 トークンのアクセス権限と有効期間を指定できます。
トークンは、有効期間後に自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。
ステップ1: RAMユーザーの作成
RAM コンソール にログインします。
左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。
[ユーザー] ページで、ユーザーの作成 をクリックします。
ログイン名 および [表示名] パラメーターを設定します。
アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。
表示されるページで、[コピー] をクリックしてRAMユーザーのAccessKeyペアを保存します。
ステップ2: RAMユーザーにAssumeRole権限を付与する
[ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。
権限の追加 パネルで、[システムポリシー] タブをクリックし、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。
[OK] をクリックします。
ステップ3: STSから一時的なアクセス資格情報を取得するために使用するロールを作成する
左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。
ロールの作成 をクリックします。 [ロールの作成] パネルで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。
ロールの作成 パネルで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択 を 現在の Alibaba Cloud アカウント に設定します。
[OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索結果で [RamOssTest] をクリックします。
RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。
手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与する
カスタムポリシーを使用して、バケットにオブジェクトをアップロードおよびバケットからオブジェクトをダウンロードする権限をロールに付与します。
左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。
ポリシー ページで ポリシーの作成 をクリックします。
[ポリシーの作成] ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを変更して、PutObjectおよびGetObjectを呼び出して、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ロールにアタッチします。
左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。
[ロール] ページで、[RamOssTest] ロールを見つけます。
[操作] 列の [権限の追加] をクリックします。
[権限の追加] パネルで、[カスタムポリシー] タブをクリックし、[RamTestPolicy] ポリシーを選択します。
[OK] をクリックします。
ステップ5: STSを使用して一時的なアクセス資格情報を生成する
一時的なアクセス資格情報には、セキュリティトークンと、AccessKey IDとAccessKeyシークレットで構成される一時的なAccessKeyペアが含まれます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。
一時的なアクセス資格情報を取得する前に、composer require alibabacloud/sts-20150401コマンドを実行してSTS依存関係をインストールし、composer require alibabacloud/sdkコマンドを実行してOSS SDK for 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';
}
Alibaba Cloud\SDK\Sts\V20150401\Stsを使用します。使用Darabonba\OpenApi\Models\Config;
listaCloud \SDK\Sts\V20150401\Models\AssumeRoleRequestを使用します。listaCloud \Tea\Utils\Utils\RuntimeOptionsを使用します。try {
// サンプルコードを実行する前に、手順1で作成したRAMユーザーのAccessKeyペアを使用して、YOUR_ACCESS_KEY_IDおよびYOUR_ACCESS_KEY_SECRET環境変数を構成していることを確認します。
$config = new Config([
'accessKeyId' => getenv('YOUR_ACCESS_KEY_ID ') 、
'accessKeySecret' => getenv('YOUR_ACCESS_KEY_SECRET ') 、
]);
//
$config->endpoint = "sts.cn-hangzhou.aliyuncs.com";
$client=新しいSts($config);
$assumeRoleRequest = new AssumeRoleRequest([
// 手順3で作成したロールのAlibaba Cloudリソース名 (ARN) を指定します。 例: acs:ram::175708322470 ****:role/ramtest。
"roleArn" => "acs:ram::175708322470 ****:role/ramtest" 、
// 異なるトークンを区別するためにroleSessionNameを指定します。 roleSessionNameは、sessiontestなどのカスタムロールセッション名を指定します。
"roleSessionName" => "sessiontest" 、
// durationSecondsを指定します。 durationSecondsは、一時アクセス資格情報の有効期間を指定します。 最小値は900です。 最大値は、現在のロールの最大セッション期間に基づいています。 単位は秒です。 この例では、有効期間は3,000秒に設定されています。
"durationSeconds" => 3000、
// カスタムポリシーを指定します。 これにより、一時的なアクセス資格情報の権限を制限できます。 カスタムポリシーを指定しない場合、返される一時的なアクセス資格情報には、指定されたRAMロールの完全な権限が付与されます。
// 一時的なアクセス資格情報によって取得される権限は、手順4で設定されたロール権限とRAMポリシーで指定された権限の共通部分です。
// "ポリシー" => ""
]);
$runtime = new RuntimeOptions([]);
$result = $client->assumeRoleWithOptions($assumeRoleRequest、$runtime);
printf("AccessKeyId:") 。 $result->body-> 資格情報->accessKeyId。 PHP_EOL);
printf("AccessKeySecret:".$result->body-> 資格情報->accessKeySecret.PHP_EOL);
printf("Expiration:".$result->body-> 資格情報->expiration.PHP_EOL);
printf("SecurityToken:".$result->body-> 資格情報->securityToken.PHP_EOL);
} catch (例外 $e){
printf($e->getMessage()) 。 PHP_EOL);
}
手順6: 一時的なアクセス資格情報を使用して、OSSへのオブジェクトのアップロードとOSSからのオブジェクトのダウンロード
一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする
<?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'; } OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、およびOSS_SESSION_TOKEN環境変数が設定されていることを確認してください。 $accessKeyId = getenv("OSS_ACCESS_KEY_ID"); $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET"); $securityToken = getenv("OSS_SESSION_TOKEN"); // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 $end point = "yourEndpoint"; // バケットの名前を指定します。 $bucket= "examplebucket"; // オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 $object = "exampleobject.txt"; // オブジェクトとしてアップロードする文字列を指定します。 $content = "Hello OSS"; try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken); // STSから取得した一時的なアクセス資格情報を使用して、オブジェクトに文字列をアップロードします。 $ossClient->putObject($bucket、$object、$content); } catch (OssException $e) { print $e->getMessage(); }
一時的なアクセス資格情報を使用してOSSからオブジェクトをダウンロードする
<?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'; } OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、およびOSS_SESSION_TOKEN環境変数が設定されていることを確認してください。 $accessKeyId = getenv("OSS_ACCESS_KEY_ID"); $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET"); $securityToken = getenv("OSS_SESSION_TOKEN"); // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 $end point = "https://oss-cn-hangzhou.aliyuncs.com"; // バケットの名前を指定します。 $bucket= "examplebucket"; // オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 $object = "exampleobject.txt"; // examplefile.txtという名前のローカルファイルとして、ローカルパスD :\\ localpathにオブジェクトをダウンロードします。 同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。 // ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。 $localfile = "D :\\ localpath\\examplefile.txt"; $options=配列 ( OssClient::OSS_FILE_DOWNLOAD => $localfile ); // try catchを使用して例外をキャッチします。 例外がキャッチされると、ダウンロードは失敗します。 例外がキャッチされない場合、ダウンロードは成功します。 try{ $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken); $ossClient->getObject($bucket、$object、$options); } catch(OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage()) 。 "\n"); 戻ります。} print(__FUNCTION__) 。 ": OK、localfileをチェックしてください: 'upload-test-object-name.txt '" 。 "\n"); }
一時的なアクセス許可に署名付きURLを使用する
署名付きURLを生成し、一時的なアクセスのためにサードパーティのユーザーにURLを提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者がOSSにアクセスできる期間を制限できます。 アクセスの承認に使用される完全なサンプルコードについては、『GitHub』をご参照ください。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を % 2B
に置き換える必要があります。 そうでない場合、署名付きURLにアクセスできない可能性があります。
versionIdヘッダーを含む署名付きURLを生成する
次のサンプルコードは、versionIdヘッダーを含む署名付きURLを生成する方法の例を示しています。
<?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';
}
OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
$end point = "yourEndpoint";
// バケットの名前を指定します。
$bucket= "examplebucket";
// オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。
$object = "exampleobject.txt";
// 署名付きURLの有効期間を3,600秒に設定します。
$timeout = 3600;
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
$options = array(
// オブジェクトのバージョンIDを指定します。
$ossClient::OSS_VERSION_ID=>"CAEQEhiBgIDmgPf8mxgiIDA1YjZlNDIxY2ZmMzQ1MmU5MTM1Y2M4Yzk4NjIx ****"
);
// Generate the signed URL.
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
printf('Sign Url:'.$signedUrl. "\n");
} catch(OssException $e) {
printf($e->getMessage()) 。 "\n");
}
署名付きURLを生成し、そのURLを使用してオブジェクトをアップロードする
署名付きURLを生成します。
<?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'; } OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。OSS\Http\RequestCoreを使用します。OSS\Http\ResponseCoreを使用します。// サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 $accessKeyId = getenv("OSS_ACCESS_KEY_ID"); $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET"); // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 $end point = "yourEndpoint"; // バケットの名前を指定します。 $bucket= "examplebucket"; // オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 $object = "exampleobject.txt"; // 署名付きURLの有効期間を3,600秒に設定します。 $timeout = 3600; try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false); // Generate the signed URL. $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT"); } catch (OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage()) 。 "\n"); 戻ります。} print(__FUNCTION__) 。 ": signedUrl: " 。 $signedUrl。 "\n");
署名付きURLを使用してオブジェクトをアップロードします。
Androidモバイルデバイス用のOSS SDKを参照できます。 詳細については、「署名付きURLを使用したオブジェクトのアップロード」をご参照ください。
署名付きURLを生成し、署名付きURLを使用してオブジェクトをダウンロードする
署名付きURLを生成します。
<?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'; } OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。OSS\Http\RequestCoreを使用します。OSS\Http\ResponseCoreを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 $accessKeyId = getenv("OSS_ACCESS_KEY_ID"); $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET"); // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 $end point = "yourEndpoint"; // バケットの名前を指定します。 $bucket= "examplebucket"; // オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 $object = "exampleobject.txt"; // 署名付きURLの有効期間を3,600秒に設定します。 $timeout = 3600; オブジェクトをプレビューするために署名付きURLが生成され、オブジェクトが格納されているバケットにマップされたカスタムドメイン名がアクセスに使用されます。 $options=配列 ( "response-content-disposition"=>"inline",); // オブジェクトのダウンロードに使用される署名付きURLを生成します。 /*$options=配列 ( "response-content-disposition"=>"attachment" 、);* / try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false); $signedUrl = $ossClient->signUrl($bucket、$object、$timeout、'GET' 、$options); } catch (OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage()) 。 "\n"); 戻ります。} print(__FUNCTION__) 。 ": signedUrl: " 。 $signedUrl。 "\n");
署名付きURLを使用してオブジェクトをダウンロードします。
Androidモバイルデバイス用のOSS SDKを参照できます。 詳細については、「署名付きURLを使用したオブジェクトのダウンロード」をご参照ください。