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

Object Storage Service:アクセス権限の付与 (C++ SDK)

最終更新日:Nov 30, 2025

このトピックでは、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 を使用した一時的なアクセス権限の付与

Alibaba Cloud STS を使用して、OSS への一時的なアクセスを許可できます。STS は、クラウドコンピューティングユーザーに一時的なアクセストークンを提供する Web サービスです。STS を使用すると、サードパーティアプリケーションまたはサブユーザーに、カスタムの有効期間と権限を持つ一時的なアクセス認証情報を付与できます。STS の詳細については、「STS とは」をご参照ください。

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

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

  • セキュリティトークンは有効期間が終了すると自動的に失効するため、手動でアクセス権限を取り消す必要はありません。

STS からの一時的なアクセス認証情報を使用して OSS にアクセスするには、次の手順を実行します:

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

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

    次のいずれかの方法で一時的なアクセス認証情報を取得できます:

    • 方法 1

      AssumeRole 操作を呼び出します。

    • 方法 2

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

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

    #include <alibabacloud/oss/OssClient.h>
    using namespace AlibabaCloud::OSS;
    
    int main(void)
    {
        /* OSS へのアクセスに使用されるアカウント情報を初期化します。 */
        
        /* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
        std::string Endpoint = "yourEndpoint";
        /* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
        std::string Region = "yourRegion";
    
        /* ネットワークリソースなどのリソースを初期化します。 */
        InitializeSdk();
    
        ClientConfiguration conf;
        conf.signatureVersion = SignatureVersionType::V4;    
        /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、および OSS_SESSION_TOKEN が設定されていることを確認してください。 */
        auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
        OssClient client(Endpoint, credentialsProvider, conf);
        client.SetRegion(Region);    
    
        /* ネットワークリソースなどのリソースを解放します。 */
        ShutdownSdk();
        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 の生成とローカルファイルのアップロード

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

    #include <alibabacloud/oss/OssClient.h>
    using namespace AlibabaCloud::OSS;
    
    int main(void)
    {
        /* OSS へのアクセスに使用されるアカウント情報を初期化します。 */
                
        /* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
        std::string Endpoint = "yourEndpoint";
        /* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
        std::string Region = "yourRegion";
        /* バケット名を指定します。例: examplebucket */
        std::string BucketName = "examplebucket";
        /* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt */   
        std::string PutobjectUrlName = "exampledir/exampleobject.txt";
    
         /* ネットワークリソースなどのリソースを初期化します。 */
        InitializeSdk();
    
        ClientConfiguration conf;
        conf.signatureVersion = SignatureVersionType::V4;
        /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。 */
        auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
        OssClient client(Endpoint, credentialsProvider, conf);
        client.SetRegion(Region);
    
        /* 署名付き URL の有効期間を指定します。最大有効期間は 32,400 秒です。単位:秒。 */
        std::time_t t = std::time(nullptr) + 1200;
        /* 署名付き URL を生成します。 */
        auto genOutcome = client.GeneratePresignedUrl(BucketName, PutobjectUrlName, t, Http::Put);
        if (genOutcome.isSuccess()) {
            std::cout << "GeneratePresignedUrl success, Gen url:" << genOutcome.result().c_str() << std::endl;
        }
        else {
            /* 例外を処理します。 */
            std::cout << "GeneratePresignedUrl fail" <<
            ",code:" << genOutcome.error().Code() <<
            ",message:" << genOutcome.error().Message() <<
            ",requestId:" << genOutcome.error().RequestId() << std::endl;
            return -1;
        }
    
        /* ネットワークリソースなどのリソースを解放します。 */
        ShutdownSdk();
        return 0;
    }
  2. 署名付き URL を使用してローカルファイルをアップロードします。

    Android モバイルデバイス用の OSS SDK を参照できます。詳細については、「アクセス権限の付与」をご参照ください。

署名付き URL の生成とオブジェクトのダウンロード

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

    #include <alibabacloud/oss/OssClient.h>
    using namespace AlibabaCloud::OSS;
    
    int main(void)
    {
        /* OSS へのアクセスに使用されるアカウント情報を初期化します。 */
                
        /* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
        std::string Endpoint = "yourEndpoint";
        /* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 */
        std::string Region = "yourRegion";
        /* バケット名を指定します。例: examplebucket */
        std::string BucketName = "examplebucket";
        /* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt */ 
        std::string GetobjectUrlName = "exampledir/exampleobject.txt";
    
        /* ネットワークリソースなどのリソースを初期化します。 */
        InitializeSdk();
    
        ClientConfiguration conf;
        conf.signatureVersion = SignatureVersionType::V4;
        /* 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。 */
        auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
        OssClient client(Endpoint, credentialsProvider, conf);
        client.SetRegion(Region);
    
        /* 署名付き URL の有効期間を指定します。最大有効期間は 32,400 秒です。単位:秒。 */
        std::time_t t = std::time(nullptr) + 1200;
        /* 署名付き URL を生成します。 */
        auto genOutcome = client.GeneratePresignedUrl(BucketName, GetobjectUrlName, t, Http::Get);
        if (genOutcome.isSuccess()) {
            std::cout << "GeneratePresignedUrl success, Gen url:" << genOutcome.result().c_str() << std::endl;
        }
        else {
            /* 例外を処理します。 */
            std::cout << "GeneratePresignedUrl fail" <<
            ",code:" << genOutcome.error().Code() <<
            ",message:" << genOutcome.error().Message() <<
            ",requestId:" << genOutcome.error().RequestId() << std::endl;
            return -1;
        }
    
        /* ネットワークリソースなどのリソースを解放します。 */
        ShutdownSdk();
        return 0;
    }
  2. 署名付き URL を使用してオブジェクトをダウンロードします。

    Android SDK を使用して、署名付き URL でファイルをダウンロードできます。詳細については、「アクセス権限の付与 (Android SDK)」をご参照ください。