このトピックでは、Security Token Service (STS) が提供する一時的なアクセス認証情報、または署名付き URL を使用して Object Storage Service (OSS) リソースに一時的にアクセスする方法について説明します。
重要 STS の一時的なアクセス認証情報と署名付き URL には有効期間を指定する必要があります。一時的なアクセス認証情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付き URL を生成する場合、最小の有効期間が優先されます。たとえば、一時的なアクセス認証情報の有効期間を 1,200 秒に設定し、その認証情報を使用して生成された署名付き URL の有効期間を 3,600 秒に設定できます。この場合、署名付き URL が有効期間内であっても、STS の一時的なアクセス認証情報の有効期限が切れた後は、署名付き URL を使用してオブジェクトをアップロードすることはできません。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントが使用されています。OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスが作成されます。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化」をご参照ください。
STS を使用して一時的なアクセスを承認する
STS を使用して OSS への一時的なアクセスを承認できます。STS は、ユーザーに一時的なアクセストークンを提供する Web サービスです。STS を使用すると、カスタムの有効期間とカスタムの権限を持つ一時的なアクセス認証情報を、サードパーティアプリケーションまたは管理対象の RAM ユーザーに付与できます。STS の詳細については、「STS とは」をご参照ください。
STS には次の利点があります。
セキュリティトークンを生成し、アクセスセキュリティトークンをサードパーティアプリケーションに送信するだけで済みます。AccessKey ペアをサードパーティアプリケーションに提供する必要はありません。このセキュリティトークンのアクセス権限と有効期間を指定できます。
セキュリティトークンは、有効期限が切れると自動的に期限切れになります。したがって、セキュリティトークンのアクセス権限を手動で取り消す必要はありません。
STS が提供する一時的なアクセス認証情報を使用して OSS にアクセスするには、次の操作を実行します。
一時的なアクセス認証情報を取得します。
一時的なアクセス認証情報には、セキュリティトークンと一時的な AccessKey ペアが含まれています。AccessKey ペアは、AccessKey ID と AccessKey シークレットで構成されます。一時的なアクセス認証情報には、セキュリティトークンと一時的な AccessKey ペアが含まれています。AccessKey ペアは、AccessKey ID と AccessKey シークレットで構成されます。詳細については、「RAM ロールの最大セッション期間を指定する」をご参照ください。
次のいずれかの方法を使用して、一時的なアクセス認証情報を取得できます。
STS から取得した一時的な認証情報を使用して、署名付きリクエストを作成します。
オブジェクトをアップロードする
#include "oss_api.h"
#include "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_KEY_ID");
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 = "More than just cloud.";
void init_options(oss_request_options_t *options)
{
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);
/* オプションを作成して初期化します。このパラメータには、endpoint、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();
return 0;
}
オブジェクトをダウンロードする
#include "oss_api.h"
#include "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_KEY_ID");
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)
{
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);
/* オプションを作成して初期化します。このパラメータには、endpoint、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();
return 0;
}
署名付き URL を使用して一時的なアクセスを承認する
使用上の注意
OSS SDK を使用して署名付き URL を生成する場合、OSS SDK はローカルコンピュータに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、その署名を URL に追加して、URL の有効性とセキュリティを確保します。URL を計算および構築するための操作は、クライアントで完了します。ネットワーク経由でサーバーにリクエストを送信する必要はありません。このようにして、署名付き URL を生成するときに、呼び出し元に特定の権限を付与する必要はありません。ただし、サードパーティユーザーが署名付き URL によって承認されたリソースに対して関連操作を実行できるようにするには、署名付き URL を生成するための API 操作を呼び出すプリンシパルが対応する権限を持っていることを確認する必要があります。
たとえば、プリンシパルが署名付き URL を使用してオブジェクトをアップロードする場合、プリンシパルに oss:PutObject 権限を付与する必要があります。プリンシパルが署名付き URL を使用してオブジェクトをダウンロードまたはプレビューする場合、プリンシパルに oss:GetObject 権限を付与する必要があります。
署名付き URL を生成し、一時的なアクセス用にビジターに提供できます。署名付き URL を生成するときに、URL の有効期間を指定して、ビジターが特定のデータにアクセスできる期間を制限できます。
HTTPS 経由でリソースにアクセスするために使用される署名付き URL を生成するには、エンドポイントのプロトコルを HTTPS に設定します。
次のサンプルコードを使用して生成された署名付き URL には、プラス記号 (+
) が含まれている場合があります。この場合、URL 内のプラス記号 (+
) を %2B
に置き換えます。そうしないと、署名付き URL を使用してオブジェクトにアクセスできない場合があります。
署名付き URL を生成し、署名付き URL を使用してファイルをアップロードする
署名付き URL を生成します。
#include "oss_api.h"
#include "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)
{
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);
/* オプションを作成して初期化します。このパラメータには、endpoint、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();
return 0;
}
署名付き URL を使用してローカルファイルをアップロードします。
Android モバイルデバイス用 OSS SDK を参照できます。詳細については、「アクセス認証」をご参照ください。
署名付き URL を生成し、署名付き URL を使用してオブジェクトをダウンロードする
署名付き URL を生成します。
#include "oss_api.h"
#include "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)
{
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);
/* オプションを作成して初期化します。このパラメータには、endpoint、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();
return 0;
}
署名付き URL を使用してオブジェクトをダウンロードします。
Android モバイルデバイス用 OSS SDK を参照できます。詳細については、「アクセス認証」をご参照ください。