すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:OSS SDK for PHPを使用してアクセスを許可する

最終更新日:Nov 12, 2024

このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースへの一時的なアクセスを許可する方法について説明します。

使用上の注意

  • STSから取得した一時的なアクセス資格情報と署名付きURLには、有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、署名付きURLが有効期間内であっても、一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョン、エンドポイント、オープンポート」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。

STSを使用した一時アクセスの許可

STSを使用して、OSSへの一時アクセスを許可できます。 STSは、ユーザーに一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、「STSとは何ですか?」をご参照ください。

STSには次の利点があります。

  • 一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 このトークンのアクセス権限と有効期間を指定できます。

  • 有効期間が終了すると、トークンは自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。

STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。

ステップ1: RAMユーザーを作成します。

  1. RAM コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。

  3. [ユーザー] ページで、ユーザーの作成 をクリックします。

  4. ログイン名 および [表示名] パラメーターを設定します。

  5. アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。

  6. プロンプトに従って完全なセキュリティ検証。

  7. AccessKeyペア (AccessKey IDとAccessKey secret) をコピーします。

    重要

    RAMユーザーのAccessKeyシークレットは、RAMユーザーを作成する場合にのみ取得できます。 認証情報の漏洩を防ぐため、AccessKeyシークレットを安全に保持する必要があります。

ステップ2: RAMユーザーにAssumeRole権限を付与します。

  1. [ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。

  2. [権限付与] パネルの [ポリシー] セクションで、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。

    説明

    AliyunSTSAssumeRoleAccessポリシーを使用すると、RAMユーザーはAssumeRole操作を呼び出すことができます。 ポリシーの権限は、RAMユーザーがSTSから一時的なアクセス資格情報を取得してOSSへのリクエストを開始するために必要な権限とは無関係です。

    image.png

  3. [権限付与] をクリックします。

ステップ3: STSから一時的なアクセス資格情報を取得するために使用されるロールを作成します。

  1. 左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。

  2. ロールの作成 をクリックします。 [ロールの作成] ウィザードの [ロールタイプの選択] ステップで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。

  3. ロールの作成 ウィザードの [ロールの設定] ステップで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択現在の Alibaba Cloud アカウント に設定します。

  4. [OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。

  5. [ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索アイコンをクリックし、検索結果で [RamOssTest] をクリックします。

  6. RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。arn

手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与します。

  1. カスタムポリシーをRAMロールにアタッチすることで、RAMロールによるオブジェクトのアップロードとダウンロードを許可します。

    1. 左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。

    2. ポリシー ページで ポリシーの作成 をクリックします。

    3. [ポリシーの作成] ページで、[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/*"
                 ]
           }
          ]
      }
    4. [次へ] をクリックしてポリシー情報を編集します。

    5. [基本情報] セクションで、[名前][RamTestPolicy] に設定し、[OK] をクリックします。

  2. カスタムポリシーをRamOssTestロールにアタッチします。

    1. 左側のナビゲーションペインで、[ID] > [ロール] を選択します。

    2. [ロール] ページで、[RamOssTest] ロールを見つけます。

    3. [操作] の [権限付与] をクリックします。

    4. [権限付与] パネルで、[ポリシー] セクションのドロップダウンリストから [カスタムポリシー] を選択し、[RamTestPolicy] ポリシーを選択します。

    5. [権限付与] をクリックします。

ステップ5: STSを使用して一時的なアクセス資格情報を生成します。

一時的なアクセス資格情報には、セキュリティトークンと一時的なAccessKeyペアが含まれます。 AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。 一時的なアクセス資格情報の有効期間は秒単位です。 一時的なアクセス資格情報の最小有効期間は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';
}
use AlibabaCloud\SDK\Sts\V20150401\Sts;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Sts\V20150401\Models\AssumeRoleRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
try {
     // Before you run the sample code, make sure that you have configured the YOUR_ACCESS_KEY_ID and YOUR_ACCESS_KEY_SECRET environment variables by using the AccessKey pair of the RAM user that was created in Step 1. 
     $config = new Config([
       'accessKeyId' => getenv('YOUR_ACCESS_KEY_ID'),
       'accessKeySecret' => getenv('YOUR_ACCESS_KEY_SECRET'),
    ]);
    // 
    $config->endpoint = "sts.cn-hangzhou.aliyuncs.com";
    $client =  new Sts($config);   
        
    $assumeRoleRequest = new AssumeRoleRequest([
        // Specify the ARN of the RAM role that was created in Step 2. Example: acs:ram::175708322470****:role/ramtest.         
        "roleArn" => "acs:ram::175708322470****:role/ramtest",
        // Specify roleSessionName to distinguish different tokens. roleSessionName specifies a custom role session name, such as sessiontest. 
        "roleSessionName" => "sessiontest",
        // Specify durationSeconds. durationSeconds specifies the validity period of the temporary access credentials. The minimum value is 900. The maximum value is based on the maximum session duration of the current role. Unit: seconds. In this example, the validity period is set to 3,000 seconds. 
        "durationSeconds" => 3000,
        // Specify the custom policies. This way, you can limit the permissions of the temporary access credentials. If you do not specify custom policies, the returned temporary access credentials have the 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 RAM policy. 
//      "policy" => ""
    ]);
    $runtime = new RuntimeOptions([]);
    $result = $client->assumeRoleWithOptions($assumeRoleRequest, $runtime);
    printf("AccessKeyId:" . $result->body->credentials->accessKeyId. PHP_EOL);
    printf("AccessKeySecret:".$result->body->credentials->accessKeySecret.PHP_EOL);
    printf("Expiration:".$result->body->credentials->expiration.PHP_EOL);
    printf("SecurityToken:".$result->body->credentials->securityToken.PHP_EOL);
}catch (Exception $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';
    }
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    
    // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN environment variables are configured. 
    $accessKeyId = getenv("OSS_ACCESS_KEY_ID");
    $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
    $securityToken = getenv("OSS_SESSION_TOKEN");
    // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    $endpoint = "yourEndpoint";
    // Specify the name of the bucket. 
    $bucket= "examplebucket";
    // Specify the full path of the object. Do not include the bucket name in the full path. 
    $object = "exampleobject.txt";
    // Specify the string that you want to upload. 
    $content = "Hello OSS";
    
    try {
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
        // Upload the object by using the temporary access credentials obtained from 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';
    }
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    
    // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN environment variables are configured. 
    $accessKeyId = getenv("OSS_ACCESS_KEY_ID");
    $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
    $securityToken = getenv("OSS_SESSION_TOKEN");
    // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    $endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // Specify the name of the bucket. 
    $bucket= "examplebucket";
    // Specify the full path of the object. Do not include the bucket name in the full path. 
    $object = "exampleobject.txt";
    // Download the object to D:\\localpath as a local file named examplefile.txt. If a file that has the same name already exists in the path, the downloaded object overwrites the file. Otherwise, the downloaded object is saved in the path. 
    // If you do not specify a local path for the downloaded object, the downloaded object is saved to the path of the project to which the sample program belongs. 
    $localfile = "D:\\localpath\\examplefile.txt";
    $options = array(
            OssClient::OSS_FILE_DOWNLOAD => $localfile
        );
    
    // Use try-catch to catch exceptions. If an exception is caught, the object fails to be downloaded. If no exceptions are caught, the object is downloaded. 
    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");
        return;
    }
    print(__FUNCTION__ . ": OK, please check localfile: 'upload-test-object-name.txt'" . "\n");
    }          

署名付きURLを使用して一時アクセスを許可する

使用上の注意

  • OSS SDKを使用して署名付きURLを生成する場合、OSS SDKはローカルコンピューターに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、URLに署名を追加してURLの有効性とセキュリティを確保します。 URLを計算し構築するために実行される操作は、クライアント上で完了する。 ネットワーク経由でサーバーにリクエストを送信する必要はありません。 この方法では、署名付きURLを生成するときに、呼び出し元に特定の権限を付与する必要はありません。 ただし、サードパーティのユーザーが署名付きURLによって承認されたリソースに対して関連する操作を実行できるようにするには、API操作を呼び出して署名付きURLを生成するプリンシパルに対応する権限があることを確認する必要があります。

    たとえば、プリンシパルが署名付きURLを使用してオブジェクトをアップロードする場合は、プリンシパルにoss:PutObject権限を付与する必要があります。 プリンシパルが署名付きURLを使用してオブジェクトをダウンロードまたはプレビューする場合は、プリンシパルにoss:GetObject権限を付与する必要があります。

  • 署名付きURLを生成し、一時的なアクセスのために訪問者にURLを提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が特定のデータにアクセスできる期間を制限できます。

  • HTTPS経由でリソースにアクセスするために使用される署名付きURLを生成するには、エンドポイントのプロトコルをHTTPSに設定します。

  • 次のサンプルコードを使用して生成された署名付き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';
  }

use OSS\OssClient;
use OSS\Core\OssException;

// 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 = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
$endpoint = "yourEndpoint";
// Specify the name of the bucket. 
$bucket= "examplebucket";
// Specify the full path of the object. Do not include the bucket name in the full path. 
$object = "exampleobject.txt";
// Set the validity period of the signed URL to 600 seconds (the maximum validity period is 32400s). 
$timeout = 600;
try{
  $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  $options = array(
      // Specify the version ID of the object. 
      $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を使用してローカルファイルをアップロード

  1. 署名付き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';
    }
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    use OSS\Http\RequestCore;
    use OSS\Http\ResponseCore;
    
    // Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
    $accessKeyId = getenv("OSS_ACCESS_KEY_ID");
    $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
    // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    $endpoint = "yourEndpoint";
    // Specify the name of the bucket. 
    $bucket= "examplebucket";
    // Specify the full path of the object. Do not include the bucket name in the full path. 
    $object = "exampleobject.txt";
    // Set the validity period of the signed URL to 600 seconds (the maximum validity period is 32400s). 
    $timeout = 600;
    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");
        return;
    }
    print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");               
  2. 署名付きURLを使用してローカルファイルをアップロードする

    Androidモバイルデバイス用のOSS SDKを参照できます。 詳細については、「署名付きURLを使用したオブジェクトのアップロード」をご参照ください。

署名付きURLを生成し、署名付きURLを使用してオブジェクトをダウンロード

  1. 署名付き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';
    }
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    use OSS\Http\RequestCore;
    use OSS\Http\ResponseCore;
    
    // 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 = getenv("OSS_ACCESS_KEY_ID");
    $accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
    // Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    $endpoint = "yourEndpoint";
    // Specify the name of the bucket. 
    $bucket= "examplebucket";
    // Specify the full path of the object. Do not include the bucket name in the full path. 
    $object = "exampleobject.txt";
    // Set the validity period of the signed URL to 600 seconds (the maximum validity period is 32400s). 
    $timeout = 600;
    // A signed URL is generated to preview an object, and the custom domain name mapped to the bucket in which the object is stored is used for access. 
    $options= array(
        "response-content-disposition"=>"inline",);
    // Generate a signed URL to download the object. 
    /*$options = array(
        "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");
        return;
    }
    print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");               
  2. 署名付きURLを使用してオブジェクトをダウンロードする

    Androidモバイルデバイス用のOSS SDKを参照できます。 詳細については、「署名付きURLを使用したオブジェクトのダウンロード」をご参照ください。