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

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

最終更新日:Jun 17, 2024

このトピックでは、Security Token Service (STS) と署名付きURLをそれぞれ使用して、Object Storage Service (OSS) への一時アクセスを許可する方法について説明します。

使用上の注意

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

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

  • この例では、OSSClientインスタンスはOSSドメイン名を使用して作成されます。 カスタムドメイン名またはSTSを使用して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. 一時的なアクセス資格情報を使用してオブジェクトをアップロードします。

'aliyun/sts' が必要です
'aliyun/oss' が必要です

sts = Aliyun::STS::Client.new (  
  # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
  access_key_id: ENV['OSS_ACCESS_KEY_ID '] 、
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET ']
)
# ロールのARNとカスタムロールセッションの名前を指定します。 
token = sts.assume_role('role-arn', 'session-name')

client = Aliyun::OSS::Client.new (
  # この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
  エンドポイント: 'https:// oss-cn-hangzhou.aliyuncs.com '、
  # STSから取得した一時的なAccessKeyペアを指定します。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 
  access_key_id: 'token.access_key_id '、
  access_key_secret: 'token.access_key_secret '、
  # STSから取得したセキュリティトークンを指定します。 
  sts_token: 'token.security_token ')

# バケットの名前を指定します。 例: examplebucket. 
bucket = client.get_bucket('examplebucket')
# オブジェクトをアップロードします。 
bucket.put_object ('exampleobject.txt ', :file => 'D :\\ localpath\\examplefile.txt') 

一時的なアクセス許可に署名付きURLを使用する

使用上の注意

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

    たとえば、オブジェクトのダウンロードまたはプレビューの署名付きURLを生成するには、oss:PutObject権限が必要です。

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

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

  • 次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+) が含まれる場合があります。 この場合、URLのプラス記号 (+) を % 2Bに置き換えます。 そうでない場合、署名付きURLを使用してオブジェクトにアクセスすることはできません。

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

  1. 署名付きURLを生成してオブジェクトをダウンロードします。

    'aliyun/oss 'が必要です
    
    client = Aliyun::OSS::Client.new (
      # この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
      エンドポイント: 'https:// oss-cn-hangzhou.aliyuncs.com '、
      # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
      access_key_id: ENV['OSS_ACCESS_KEY_ID '] 、
      access_key_secret: ENV['OSS_ACCESS_KEY_SECRET ']
    )
    # バケットの名前を指定します。 例: examplebucket. 
    bucket = client.get_bucket('examplebucket')
    
    # オブジェクトのダウンロードに使用される署名付きURLを生成し、URLの有効期間を3,600秒に設定します。 
    puts bucket.object_url('my-object', true, 3600) 
  2. モバイルデバイスまたはブラウザで署名付きURLを使用してオブジェクトをダウンロードします。
    // 生成された署名付きURLを入力します。 
    文字列url = "";
    OkHttpClient client = new OkHttpClient();
    // 署名付きURLを使用してオブジェクトをダウンロードします。 
    Request getRequest = new Request.Builder()
            . url(url)
            . get()
            . build();
    client.newCall(getRequest).enqueue(new Callback() {
        @Override
        public void onFailure (コールコール, IOException e) {
            e.printStackTrace();
        }
    
        @Override
        public void onResponse (コールコール、レスポンスレスポンス) throws IOException {
            if (response.code() == 203 | | response.code() >= 300) {
                Log.d("ダウンロード" 、"失敗");
                Log.d("download", response.body().string());
                return;
            }
            // オブジェクトがダウンロードされます。 
            InputStream inputStream = response.body().byteStream();
    
            byte[] buffer = new byte[2048];
            int len;
    
            while ((len = inputStream.read(buffer)) ! = -1) {
                // ダウンロードしたデータを処理します。 たとえば、画像を表示したり、オブジェクトに書き込み操作を実行したりします。 
            }
        }
    }); 
    // 署名付きURLを使用してオブジェクトをダウンロードします。 
    NSURL * url = [NSURL URLWithString:urlString];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    NSURLSession * session = [NSURLSession sharedSession];
    NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request
                                                completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@ "ダウンロードエラー: % @" 、エラー);
            戻る;
        } else if (((NSHTTPURLResponse *)response).statusCode == 203 | |
                   ((NSHTTPURLResponse *) レスポンス) 。statusCode >= 300) {
            NSString * body = [[NSString alloc] initWithData: データエンコード: NSUTF8StringEncoding];
            NSLog(@ "ダウンロードエラー: % @" 、本文);
            return;
        }
        NSLog(@ "ダウンロード成功");
    }];
    [sessionTask resume]; 
    // web APIのHTMLページまたはwindow.openの <a> タグのダウンロード属性を使用して、オブジェクトURLを取得することもできます。 

関連ドキュメント