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

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

最終更新日:Jun 17, 2024

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

重要

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

使用上の注意

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

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

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

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

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

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

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

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

  1. 一時的なアクセス資格情報を取得します。

    一時的なアクセス資格情報には、セキュリティトークンと、AccessKey IDとAccessKeyシークレットで構成される一時的なAccessKeyペアが含まれます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。

    次のいずれかの方法を使用して、一時的なアクセス資格情報を取得できます。

    • 方法 1

      AssumeRole操作を呼び出して、一時的なアクセス資格情報を取得します。

    • 方法 2

      STS SDKを使用して一時的なアクセス資格情報を取得します。 詳細については、「STS SDKの概要」をご参照ください。

  2. STSから取得した一時的な資格情報を使用して、署名付きリクエストを作成します。

    • オブジェクトのアップロード

      #include "oss_api.h"
      # 「aos_http_io.h」を含める
      /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 * /
      const char * endpoint = "yourEndpoint";
      /* サンプルコードを実行する前に、STSから取得した一時的なアクセス資格情報に基づいて、YOUR_ACCESS_KEY_IDおよびYOUR_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 * /
      const char * access_key_id = getenv("OSS_ACCESS_KEYID");
      const char * access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
      /* STSから取得したセキュリティトークンを指定します。 * /
      const char * sts_token = "yourStsToken";
      /* バケットの名前を指定します。 例: examplebucket. * /
      const char * bucket_name = "examplebucket";
      /* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 * /
      const char * object_name = "exampledir/exampleobject.txt";
      const char * object_content = "クラウドだけではありません。";
      
      void init_options(oss_request_options_t * オプション)
      {
          options->config = oss_config_create(options->pool);
          /* char * 文字列を使用してaos_string_tを初期化します。 */
          aos_str_set(&options->config->endpoint, endpoint);
          aos_str_set(&options->config->access_key_id, access_key_id);
          aos_str_set(&options->config->access_key_secret, access_key_secret);
          aos_str_set(&options->config->sts_token, sts_token);
          /* CNAMEを使用するかどうかを指定します。 値0は、CNAMEが使用されないことを示す。 */
          options->config->is_cname = 0;
          /* タイムアウト期間などのネットワークパラメーターを設定します。 */
          options->ctl = aos_http_controller_create(options->pool, 0);
      }
      
      int main(int argc, char * argv[])
      {
          /* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークやメモリリソースなどのグローバルリソースを初期化します。 */
          if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
              exit(1);
          }
      
          /* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
          aos_pool_t *pool;
          /* メモリプールを再作成します。 2番目のパラメーターはNULLです。これは、プールが他のメモリプールを継承しないことを示します。 */
          aos_pool_create(&pool, NULL);
          /* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報が含まれます。 */
          oss_request_options_t *oss_client_options;
          /* メモリプール内のメモリリソースをオプションに割り当てます。 */
          oss_client_options = oss_request_options_create(pool);
          /* oss_client_optionsを初期化します。 */
          init_options(oss_client_options);
      
          /* パラメーターを初期化します。 */
          aos_string_t bucket;
          aos_string_t object;
          aos_list_t buffer;
          aos_buf_t *content = NULL;
          aos_table_t *headers = NULL;
          aos_table_t *resp_headers = NULL; 
          aos_status_t *resp_status = NULL; 
          /* char * データをバケットに割り当てます。 */
          aos_str_set(&bucket, bucket_name);
          aos_str_set(&object, object_name);
      
          aos_list_init(&buffer);
          content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
          aos_list_add_tail(&content->node, &buffer);
      
          /* オブジェクトをアップロードします。 */
          resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object, &buffer, headers, &resp_headers);
          /* オブジェクトがアップロードされているかどうかを確認します。 */
          if (aos_status_is_ok(resp_status)) {
              printf("put object from buffer succeeded\n");
          } else {
              printf("put object from buffer failed\n");      
          }    
      
          /* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
          aos_pool_destroy(pool);
      
          /* 割り当てられたグローバルリソースを解放します。 */
          aos_http_io_deinitialize();
      
          0を返します。} 
    • オブジェクトのダウンロード

      #include "oss_api.h"
      # 「aos_http_io.h」を含める
      /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 * /
      const char * endpoint = "yourEndpoint";
      /* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 * /
      const char * access_key_id = getenv("OSS_ACCESS_KEYID");
      const char * access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
      /* STSから取得したセキュリティトークンを指定します。 * /
      const char * sts_token = "yourStsToken";
      /* バケットの名前を指定します。 例: examplebucket. * /
      const char * bucket_name = "examplebucket";
      /* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 * /
      const char * object_name = "exampledir/exampleobject.txt";
      void init_options(oss_request_options_t * オプション)
      {
          options->config = oss_config_create(options->pool);
          /* char * 文字列を使用してaos_string_tを初期化します。 */
          aos_str_set(&options->config->endpoint, endpoint);
          aos_str_set(&options->config->access_key_id, access_key_id);
          aos_str_set(&options->config->access_key_secret, access_key_secret);
          aos_str_set(&options->config->sts_token, sts_token);
          /* CNAMEを使用するかどうかを指定します。 値0は、CNAMEが使用されないことを示す。 */
          options->config->is_cname = 0;
          /* タイムアウト時間などのネットワークパラメーターを指定します。 */
          options->ctl = aos_http_controller_create(options->pool, 0);
      }
      int main(int argc, char * argv[])
      {
          /* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークやメモリリソースなどのグローバルリソースを初期化します。 */
          if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
              exit(1);
          }
          /* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
          aos_pool_t *pool;
          /* メモリプールを作成します。 2番目のパラメーターの値はNULLです。 この値は、プールが他のメモリプールを継承しないことを指定します。 */
          aos_pool_create(&pool, NULL);
          /* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報が含まれます。 */
          oss_request_options_t *oss_client_options;
          /* メモリプール内のメモリリソースをオプションに割り当てます。 */
          oss_client_options = oss_request_options_create(pool);
          /* oss_client_optionsを初期化します。 */
          init_options(oss_client_options);
          /* パラメーターを初期化します。 */
          aos_string_t bucket;
          aos_string_t object;
          aos_list_t buffer;
          aos_buf_t *content = NULL;
          aos_table_t *params = NULL;
          aos_table_t *headers = NULL;
          aos_table_t *resp_headers = NULL; 
          aos_status_t *resp_status = NULL; 
          char *buf = NULL;
          int64_t len = 0;
          int64_t size = 0;
          int64_t pos = 0;
          aos_str_set(&bucket, bucket_name);
          aos_str_set(&object, object_name);
          aos_list_init(&buffer);
          /* オブジェクトをローカルメモリにダウンロードします。 */
          resp_status = oss_get_object_to_buffer(oss_client_options, &bucket, &object, 
                                       headers, params, &buffer, &resp_headers);
          if (aos_status_is_ok(resp_status)) {
              printf("get object to buffer succeeded\n");
              /* ダウンロードしたコンテンツをバッファにコピーします。 */
              len = aos_buf_list_len(&buffer);
              buf = aos_pcalloc(pool, len + 1);
              buf[len] = '\0';
              aos_list_for_each_entry(aos_buf_t, content, &buffer, node) {
              size = aos_buf_size(content);
                  memcpy(buf + pos, content->pos, size);
                  pos += size;
              }
          }
          else {
              printf("get object to buffer failed\n");  
          }
          /* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
          aos_pool_destroy(pool);
          /* 割り当てられたグローバルリソースを解放します。 */
          aos_http_io_deinitialize();
          0を返します。} 

署名付き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を使用してオブジェクトにアクセスすることはできません。

署名付きURLを生成し、署名付きURLを使用してファイルをアップロード

  1. 署名付きURLを生成します。

    #include "oss_api.h"
    # 「aos_http_io.h」を含める
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 * /
    const char * endpoint = "yourEndpoint";
    
    /* バケットの名前を指定します。 例: examplebucket. * /
    const char * bucket_name = "examplebucket";
    /* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 * /
    const char * object_name = "exampledir/exampleobject.txt";
    /* ローカルファイルのフルパスを指定します。 * /
    const char * local_filename = "yourLocalFilename";
    void init_options(oss_request_options_t * オプション)
    {
        options->config = oss_config_create(options->pool);
        /* char * 文字列を使用してaos_string_tを初期化します。 */
        aos_str_set(&options->config->endpoint, endpoint);
        /* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
        aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
        aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
        /* CNAMEを使用するかどうかを指定します。 値0は、CNAMEが使用されないことを示す。 */
        options->config->is_cname = 0;
        /* タイムアウト期間などのネットワークパラメーターを設定します。 */
        options->ctl = aos_http_controller_create(options->pool, 0);
    }
    int main(int argc, char * argv[])
    {
        /* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークやメモリリソースなどのグローバルリソースを初期化します。 */
        if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
            exit(1);
        }
        /* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
        aos_pool_t *pool;
        /* メモリプールを作成します。 2番目のパラメーターの値はNULLです。 この値は、プールが他のメモリプールを継承しないことを指定します。 */
        aos_pool_create(&pool, NULL);
        /* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報が含まれます。 */
        oss_request_options_t *oss_client_options;
        /* メモリプール内のメモリリソースをオプションに割り当てます。 */
        oss_client_options = oss_request_options_create(pool);
        /* oss_client_optionsを初期化します。 */
        init_options(oss_client_options);
        /* パラメーターを初期化します。 */
        aos_string_t bucket;
        aos_string_t object;
        aos_string_t file;    
        aos_http_request_t *req;
        apr_time_t now;
        char *url_str;
        aos_string_t url;
        int64_t expire_time; 
        int one_hour = 3600;
        aos_str_set(&bucket, bucket_name);
        aos_str_set(&object, object_name);
        aos_str_set(&file, local_filename);
        expire_time = now / 1000000 + one_hour;    
        req = aos_http_request_create(pool);
        req->method = HTTP_PUT;
        now = apr_time_now(); 
        /* 有効期間を指定します。 単位: マイクロ秒 * /
        expire_time = now / 1000000 + one_hour;
        /* 署名付きURLを生成します。 */
        url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
        aos_str_set(&url, url_str);
        printf("オブジェクトのアップロードに使用される署名付きURL: % s\n", url_str);    
        /* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
        aos_pool_destroy(pool);
        /* 割り当てられたグローバルリソースを解放します。 */
        aos_http_io_deinitialize();
        0を返します。} 
  2. 署名付きURLを使用してローカルファイルをアップロードする

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

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

  1. 署名付きURLを生成します。

    #include "oss_api.h"
    # 「aos_http_io.h」を含める
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 * /
    const char * endpoint = "yourEndpoint";
    /* バケットの名前を指定します。 例: examplebucket. * /
    const char * bucket_name = "examplebucket";
    /* オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 * /
    const char * object_name = "exampledir/exampleobject.txt";
    /* ローカルファイルのフルパスを指定します。 * /
    const char * local_filename = "yourLocalFilename";
    
    void init_options(oss_request_options_t * オプション)
    {
        options->config = oss_config_create(options->pool);
        /* char * 文字列を使用してaos_string_tを初期化します。 */
        aos_str_set(&options->config->endpoint, endpoint);
        /* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
        aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
        aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
        /* CNAMEを使用するかどうかを指定します。 値0は、CNAMEが使用されないことを示す。 */
        options->config->is_cname = 0;
        /* タイムアウト期間などのネットワークパラメーターを設定します。 */
        options->ctl = aos_http_controller_create(options->pool, 0);
    }
    int main(int argc, char * argv[])
    {
        /* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークやメモリリソースなどのグローバルリソースを初期化します。 */
        if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
            exit(1);
        }
        /* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
        aos_pool_t *pool;
        /* メモリプールを作成します。 2番目のパラメーターの値はNULLです。 この値は、プールが他のメモリプールを継承しないことを指定します。 */
        aos_pool_create(&pool, NULL);
        /* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報が含まれます。 */
        oss_request_options_t *oss_client_options;
        /* メモリプール内のメモリリソースをオプションに割り当てます。 */
        oss_client_options = oss_request_options_create(pool);
        /* oss_client_optionsを初期化します。 */
        init_options(oss_client_options);
        /* パラメーターを初期化します。 */
        aos_string_t bucket;
        aos_string_t object;
        aos_string_t file;    
        aos_http_request_t *req;
        apr_time_t now;
        char *url_str;
        aos_string_t url;
        int64_t expire_time; 
        int one_hour = 3600;
        aos_str_set(&bucket, bucket_name);
        aos_str_set(&object, object_name);
        aos_str_set(&file, local_filename);
        expire_time = now / 1000000 + one_hour;    
        req = aos_http_request_create(pool);
        req->method = HTTP_GET;
        now = apr_time_now();  
        /* 有効期間を指定します。 単位: マイクロ秒 * /
        expire_time = now / 1000000 + one_hour;
        /* 署名付きURLを生成します。 */
        url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
        aos_str_set(&url, url_str);
        printf("一時ダウンロードURL: % s\n", url_str);     
        /* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
        aos_pool_destroy(pool);
        /* 割り当てられたグローバルリソースを解放します。 */
        aos_http_io_deinitialize();
        0を返します。} 
  2. 署名付きURLを使用してオブジェクトをダウンロードする

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