全部产品
Search
文档中心

Object Storage Service:Otorisasi akses (C SDK)

更新时间:Nov 30, 2025

Topik ini menjelaskan cara menggunakan kredensial akses temporary dari Alibaba Cloud Security Token Service (STS) atau URL yang ditandatangani (presigned URL) untuk mengakses sementara sumber daya Object Storage Service (OSS).

Penting

Anda harus menentukan periode validitas untuk kredensial akses temporary STS dan presigned URL. Jika Anda menggunakan kredensial akses temporary untuk menghasilkan presigned URL guna melakukan operasi seperti mengunggah atau mengunduh file, maka periode validitas yang lebih pendek akan berlaku. Misalnya, jika periode validitas kredensial akses temporary STS Anda adalah 1.200 detik dan periode validitas presigned URL adalah 3.600 detik, Anda tidak dapat menggunakan presigned URL tersebut untuk mengunggah file setelah 1.200 detik karena kredensial akses temporary STS telah kedaluwarsa.

Catatan penggunaan

  • Pada topik ini, digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Regions and endpoints.

  • Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Initialization (C SDK).

Gunakan STS untuk otorisasi akses temporary

OSS mendukung otorisasi akses temporary melalui Alibaba Cloud Security Token Service (STS). STS adalah layanan web yang menyediakan token akses temporary bagi pengguna komputasi awan. Dengan STS, Anda dapat menerbitkan kredensial akses dengan periode validitas dan izin yang dapat dikustomisasi kepada aplikasi pihak ketiga atau sub-user (pengguna yang identitasnya Anda kelola). Untuk informasi selengkapnya mengenai STS, lihat What is STS.

STS memberikan manfaat berikut:

  • Anda tidak perlu mengekspos pasangan AccessKey jangka panjang Anda ke aplikasi pihak ketiga. Sebagai gantinya, Anda dapat menghasilkan token akses dan memberikannya ke aplikasi tersebut. Anda dapat mengkustomisasi izin akses dan periode validitas token ini.

  • Anda tidak perlu mengelola pencabutan izin secara manual. Token akses akan otomatis menjadi tidak valid saat masa berlakunya habis.

Untuk mengakses OSS menggunakan kredensial akses temporary dari STS, lakukan langkah-langkah berikut:

  1. Dapatkan kredensial akses temporary

    Kredensial akses temporary mencakup pasangan AccessKey temporary (ID AccessKey dan Rahasia AccessKey) serta token keamanan (SecurityToken). Periode validitas kredensial akses temporary ditentukan dalam satuan detik. Nilai minimumnya adalah 900. Nilai maksimumnya adalah durasi sesi maksimum yang ditentukan untuk peran RAM saat ini. Untuk informasi selengkapnya, lihat Set the maximum session duration for a RAM role.

    Anda dapat memperoleh kredensial akses temporary dengan salah satu cara berikut.

    • Metode 1

      Panggil operasi AssumeRole untuk mendapatkan kredensial akses temporary.

    • Metode 2

      Gunakan STS SDK untuk mendapatkan kredensial akses temporary. Untuk informasi selengkapnya, lihat STS SDKs.

  2. Gunakan kredensial STS untuk membuat permintaan yang ditandatangani.

    • Unggah file

      #include "oss_api.h"
      #include "aos_http_io.h"
      /* Tetapkan yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. */
      const char *endpoint = "yourEndpoint";
      /* Sebelum menjalankan kode contoh ini, pastikan Anda telah menyetel variabel lingkungan YOUR_ACCESS_KEY_ID dan YOUR_ACCESS_KEY_SECRET berdasarkan pasangan AccessKey temporary yang diperoleh dari STS. */  
      const char *access_key_id = getenv("OSS_ACCESS_KEY_ID");
      const char *access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
      /* Token keamanan (SecurityToken) yang diperoleh dari STS. */
      const char *sts_token = "yourStsToken";
      /* Tentukan nama bucket. Misalnya, examplebucket. */
      const char *bucket_name = "examplebucket";
      /* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
      const char *object_name = "exampledir/exampleobject.txt";
      const char *object_content = "More than just cloud.";
      
      void init_options(oss_request_options_t *options)
      {
          options->config = oss_config_create(options->pool);
          /* Inisialisasi tipe aos_string_t dengan string char*. */
          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);
          /* Tentukan apakah akan menggunakan CNAME untuk mengakses OSS. Nilai 0 berarti CNAME tidak digunakan. */
          options->config->is_cname = 0;
          /* Tetapkan parameter jaringan, seperti periode timeout. */
          options->ctl = aos_http_controller_create(options->pool, 0);
      }
      
      int main(int argc, char *argv[])
      {
          /* Panggil metode aos_http_io_initialize di awal program untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
          if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
              exit(1);
          }
      
          /* Pool memori (pool) untuk manajemen memori, yang setara dengan apr_pool_t. Kode implementasinya berada di library APR. */
          aos_pool_t *pool;
          /* Buat pool memori baru. Parameter kedua bernilai NULL, yang berarti pool ini tidak mewarisi dari pool memori lainnya. */
          aos_pool_create(&pool, NULL);
          /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
          oss_request_options_t *oss_client_options;
          /* Alokasikan memori untuk opsi dalam pool memori. */
          oss_client_options = oss_request_options_create(pool);
          /* Inisialisasi opsi klien oss_client_options. */
          init_options(oss_client_options);
      
          /* Inisialisasi parameter. */
          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; 
          /* Tetapkan data bertipe char* ke bucket. */
          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);
      
          /* Unggah file. */
          resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object, &buffer, headers, &resp_headers);
          /* Periksa apakah file berhasil diunggah. */
          if (aos_status_is_ok(resp_status)) {
              printf("put object from buffer succeeded\n");
          } else {
              printf("put object from buffer failed\n");      
          }    
      
          /* Hancurkan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk berbagai sumber daya selama permintaan. */
          aos_pool_destroy(pool);
      
          /* Lepaskan sumber daya global yang sebelumnya dialokasikan. */
          aos_http_io_deinitialize();
      
          return 0;
      }            
    • Unduh file

      #include "oss_api.h"
      #include "aos_http_io.h"
      /* Tetapkan yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. */
      const char *endpoint = "yourEndpoint";
      /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. */  
      const char *access_key_id = getenv("OSS_ACCESS_KEY_ID");
      const char *access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
      /* Token keamanan (SecurityToken) yang diperoleh dari STS. */
      const char *sts_token = "yourStsToken";
      /* Tentukan nama bucket. Misalnya, examplebucket. */
      const char *bucket_name = "examplebucket";
      /* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
      const char *object_name = "exampledir/exampleobject.txt";
      void init_options(oss_request_options_t *options)
      {
          options->config = oss_config_create(options->pool);
          /* Inisialisasi tipe aos_string_t dengan string char*. */
          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);
          /* Tentukan apakah CNAME digunakan. Nilai 0 berarti CNAME tidak digunakan. */
          options->config->is_cname = 0;
          /* Digunakan untuk menyetel parameter jaringan, seperti periode timeout. */
          options->ctl = aos_http_controller_create(options->pool, 0);
      }
      int main(int argc, char *argv[])
      {
          /* Panggil metode aos_http_io_initialize di awal program untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
          if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
              exit(1);
          }
          /* Pool memori (pool) untuk manajemen memori, yang setara dengan apr_pool_t. Kode implementasinya berada di library APR. */
          aos_pool_t *pool;
          /* Buat pool memori baru. Parameter kedua bernilai NULL, yang berarti pool ini tidak mewarisi dari pool memori lainnya. */
          aos_pool_create(&pool, NULL);
          /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
          oss_request_options_t *oss_client_options;
          /* Alokasikan memori untuk opsi dalam pool memori. */
          oss_client_options = oss_request_options_create(pool);
          /* Inisialisasi opsi klien oss_client_options. */
          init_options(oss_client_options);
          /* Inisialisasi parameter. */
          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);
          /* Unduh file ke memori lokal. */
          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");
              /* Salin konten yang diunduh ke buffer. */
              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");  
          }
          /* Hancurkan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk berbagai sumber daya selama permintaan. */
          aos_pool_destroy(pool);
          /* Lepaskan sumber daya global yang sebelumnya dialokasikan. */
          aos_http_io_deinitialize();
          return 0;
      }

Gunakan presigned URL untuk otorisasi akses temporary

Catatan penggunaan

  • Saat Anda menggunakan OSS SDK untuk menghasilkan presigned URL, OSS SDK menggunakan algoritma tertentu berdasarkan informasi kunci yang disimpan di komputer lokal untuk menghitung signature dan menambahkannya ke URL guna memastikan validitas dan keamanan URL tersebut. Operasi penghitungan dan pembentukan URL ini dilakukan sepenuhnya di sisi client. Anda tidak perlu mengirim permintaan ke server melalui jaringan. Dengan demikian, Anda tidak perlu memberikan izin khusus kepada pemanggil saat menghasilkan presigned URL. Namun, untuk memungkinkan pengguna pihak ketiga melakukan operasi terkait pada sumber daya yang diotorisasi oleh presigned URL, Anda harus memastikan bahwa principal yang memanggil operasi API untuk menghasilkan presigned URL memiliki izin yang sesuai.

    Misalnya, jika suatu principal ingin mengunggah objek menggunakan presigned URL, Anda harus memberikan izin oss:PutObject kepada principal tersebut. Jika suatu principal ingin mengunduh atau melihat pratinjau objek menggunakan presigned URL, Anda harus memberikan izin oss:GetObject kepada principal tersebut.

  • Anda dapat menghasilkan presigned URL dan memberikannya kepada pengunjung untuk akses sementara. Saat menghasilkan presigned URL, Anda dapat menentukan periode validitas URL tersebut untuk membatasi durasi waktu pengunjung dapat mengakses data tertentu.

  • Untuk menghasilkan presigned URL yang digunakan untuk mengakses sumber daya melalui HTTPS, tetapkan protokol pada endpoint ke HTTPS.

  • Presigned URL yang dihasilkan menggunakan kode contoh berikut mungkin mengandung tanda plus (+). Dalam kasus ini, ganti tanda plus (+) dalam URL tersebut dengan %2B. Jika tidak, presigned URL tersebut mungkin tidak dapat digunakan untuk mengakses objek sebagaimana diharapkan.

Hasilkan presigned URL dan gunakan untuk mengunggah file

  1. Hasilkan presigned URL untuk unggah

    #include "oss_api.h"
    #include "aos_http_io.h"
    /* Tetapkan yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. */
    const char *endpoint = "yourEndpoint";
    
    /* Tentukan nama bucket. Misalnya, examplebucket. */
    const char *bucket_name = "examplebucket";
    /* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
    const char *object_name = "exampledir/exampleobject.txt";
    /* Tentukan path lengkap file lokal. */
    const char *local_filename = "yourLocalFilename";
    void init_options(oss_request_options_t *options)
    {
        options->config = oss_config_create(options->pool);
        /* Inisialisasi tipe aos_string_t dengan string char*. */
        aos_str_set(&options->config->endpoint, endpoint);
        /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. */
        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"));
        /* Tentukan apakah akan menggunakan CNAME untuk mengakses OSS. Nilai 0 berarti CNAME tidak digunakan. */
        options->config->is_cname = 0;
        /* Tetapkan parameter jaringan, seperti periode timeout. */
        options->ctl = aos_http_controller_create(options->pool, 0);
    }
    int main(int argc, char *argv[])
    {
        /* Panggil metode aos_http_io_initialize di awal program untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
        if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
            exit(1);
        }
        /* Pool memori (pool) untuk manajemen memori, yang setara dengan apr_pool_t. Kode implementasinya berada di library APR. */
        aos_pool_t *pool;
        /* Buat pool memori baru. Parameter kedua bernilai NULL, yang berarti pool ini tidak mewarisi dari pool memori lainnya. */
        aos_pool_create(&pool, NULL);
        /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
        oss_request_options_t *oss_client_options;
        /* Alokasikan memori untuk opsi dalam pool memori. */
        oss_client_options = oss_request_options_create(pool);
        /* Inisialisasi opsi klien oss_client_options. */
        init_options(oss_client_options);
        /* Inisialisasi parameter. */
        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(); 
        /* Satuan: mikrodetik. */
        expire_time = now / 1000000 + one_hour;
        /* Hasilkan presigned URL. */
        url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
        aos_str_set(&url, url_str);
        printf("Temporary upload URL: %s\n", url_str);    
        /* Hancurkan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk berbagai sumber daya selama permintaan. */
        aos_pool_destroy(pool);
        /* Lepaskan sumber daya global yang sebelumnya dialokasikan. */
        aos_http_io_deinitialize();
        return 0;
    }
  2. Gunakan presigned URL untuk mengunggah file

    Anda dapat merujuk pada kode contoh untuk Android SDK untuk mengunggah file menggunakan presigned URL. Untuk informasi selengkapnya, lihat Authorize access (Android SDK).

Hasilkan presigned URL dan gunakan untuk mengunduh file

  1. Hasilkan presigned URL untuk unduh

    #include "oss_api.h"
    #include "aos_http_io.h"
    /* Tetapkan yourEndpoint ke titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), tetapkan titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. */
    const char *endpoint = "yourEndpoint";
    /* Tentukan nama bucket. Misalnya, examplebucket. */
    const char *bucket_name = "examplebucket";
    /* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
    const char *object_name = "exampledir/exampleobject.txt";
    /* Tentukan path lengkap file lokal. */
    const char *local_filename = "yourLocalFilename";
    
    void init_options(oss_request_options_t *options)
    {
        options->config = oss_config_create(options->pool);
        /* Inisialisasi tipe aos_string_t dengan string char*. */
        aos_str_set(&options->config->endpoint, endpoint);
        /* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. */
        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"));
        /* Tentukan apakah akan menggunakan CNAME untuk mengakses OSS. Nilai 0 berarti CNAME tidak digunakan. */
        options->config->is_cname = 0;
        /* Tetapkan parameter jaringan, seperti periode timeout. */
        options->ctl = aos_http_controller_create(options->pool, 0);
    }
    int main(int argc, char *argv[])
    {
        /* Panggil metode aos_http_io_initialize di awal program untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
        if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
            exit(1);
        }
        /* Pool memori (pool) untuk manajemen memori, yang setara dengan apr_pool_t. Kode implementasinya berada di library APR. */
        aos_pool_t *pool;
        /* Buat pool memori baru. Parameter kedua bernilai NULL, yang berarti pool ini tidak mewarisi dari pool memori lainnya. */
        aos_pool_create(&pool, NULL);
        /* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
        oss_request_options_t *oss_client_options;
        /* Alokasikan memori untuk opsi dalam pool memori. */
        oss_client_options = oss_request_options_create(pool);
        /* Inisialisasi opsi klien oss_client_options. */
        init_options(oss_client_options);
        /* Inisialisasi parameter. */
        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();  
        /* Satuan: mikrodetik. */
        expire_time = now / 1000000 + one_hour;
        /* Hasilkan presigned URL. */
        url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
        aos_str_set(&url, url_str);
        printf("Temporary download URL: %s\n", url_str);     
        /* Hancurkan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk berbagai sumber daya selama permintaan. */
        aos_pool_destroy(pool);
        /* Lepaskan sumber daya global yang sebelumnya dialokasikan. */
        aos_http_io_deinitialize();
        return 0;
    }
  2. Gunakan presigned URL untuk mengunduh file

    Anda dapat merujuk pada kode contoh untuk Android SDK untuk mengunduh file menggunakan presigned URL. Untuk informasi selengkapnya, lihat Authorize access (Android SDK).