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

Object Storage Service:アクセス許可

最終更新日:Dec 18, 2023

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

重要

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

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

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

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

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

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

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

  1. STSサーバーを構築します。

    // STSを使用して一時的なアクセス資格情報を生成します。 一時的なアクセス資格情報は、AccessKeyペアとセキュリティトークンで構成されます。 
    const { STS } = require('ali-oss ');
    const express = require("express");
    const app = express();
    
    app.get('/sts', (req, res) => {
     let sts=新しいSTS({
      // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
      accessKeyId: process.env.OSS_ACCESS_KEY_ID、
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET
    });
      // roleArnをRAMロールのAlibaba Cloudリソース名 (ARN) に設定します。 
      // ポリシーをカスタム権限ポリシーに設定します。 
      // expirationは、一時的なアクセス資格情報の有効期間を指定します。 単位は秒です。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 
      // sessionNameは、さまざまなトークンを区別するために使用されるカスタムロールセッション名を指定します。 例: SessionTest。 
      sts.assumeRole('acs:ram::137918634953 ****:role/ossram', '{
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "アクション": [
    "oss:*"
    ],
                "Resource": [
                    "acs:oss:*:*:examplebucket" 、
                    "acs:oss:*:*:examplebucket/*"
                ]
            }
        ]
    } ', '3600', 'SessionTest').then((結果) => {
        console.log (結果);
        res.set('Access-Control-Allow-Origin' 、'*');
        res.set('Access-Control-Allow-METHOD' 、'GET');
        res.json({
          AccessKeyId: result.credentials.AccessKeyId、
          AccessKeySecret: result.credentials.AccessKeySecret、
          SecurityToken: result.credentials.SecurityToken,
          有効期限: result.credentials。有効期限
        });
      }).catch((err) => {
        console.log(err);
        res.status(400).json(err.message);
      });
    });
    app.listen(8000,()=>{
       console.log("server listen on:8000")
    }) 

  2. STS資格情報を使用してリクエストに署名します。

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title> ドキュメント </title>
      </head>
      <body>
        <!-- SDKファイルのインポート->
        <スクリプト
          type="text/javascript"
          src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"
        ></script>
        <script type="text/javascript">
          // 認証サーバーのアドレスを指定します。 例: http:// 127.0.0.1:8000/sts 
          fetch("yourStsServer")
            . then((resp) => resp.json())
            . then((result) => {
              const store = new OSS({
                // Security Token Service (STS) から取得した一時的なAccessKeyペアを指定します。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 
                accessKeyId: result.AccessKeyId、
                accessKeySecret: result.AccessKeySecret,
                // STSから取得したセキュリティトークンを指定します。 
                stsToken: result.SecurityToken,
                // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 
                リージョン: "oss-cn-hangzhou" 、
                // バケットの名前を指定します。 例: examplebucket. 
                bucket: "examplebucket" 、
              });
              // Generate the signed URL. 
              // オブジェクトのフルパスを指定します。 例: oss.png。 バケット名をフルパスに含めないでください。 
              const url = store.signatureUrl("oss.png");
              console.log(url);
            });
        </script>
      </body>
    </html>
    

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

重要

カスタムパラメーターを含む署名付きURLを使用してブラウザーからオブジェクトにアクセスするには、URLに含まれるContent-Typeパラメーターの値が、リクエストで指定されたContent-Typeの値と同じであることを確認します。 それ以外の場合、OSSはSignatureDoesNotMatchエラーを報告する可能性があります。 Content-Typeを設定する方法の詳細については、「Content-Typeヘッダーを設定する方法」を参照してください。

  1. オブジェクトのアップロードに使用する署名付きURLを生成します。

    // 一時的なアクセス資格情報を生成します。 
    const OSS = require("ali-oss");
    const STS = require("ali-oss").STS;
    // const cors = require("cors");
    
    const stsClient = new STS({
      // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
      accessKeyId: process.env.OSS_ACCESS_KEY_ID、
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、});
    // バケットの名前を指定します。 例: examplebucket. 
    const bucket = "examplebucket";
    // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 
    const region = "yourRegion";
    // RAMロールのARNを指定します。 
    const roleArn = "acs:ram::137918634953 ****:role/ossram";
    const getSts = () => {
      stsClient
        . assumeRole (assumeRole)
          roleArn,
          `{
            "Statement": [
              {
                "Effect": "Allow",
                "Action": "*",
                "Resource": [
                  "acs:oss:*:*:examplebucket/*"
                ]
              }
            ]
          }`,
          3000 // セキュリティトークンの有効期限を指定します。 
        )
        . then((r) => {
          console.log("send:", r.credentials);
          const { SecurityToken, AccessKeyId, AccessKeySecret } = r.credentials;
          const client = new OSS({
            バケット、
            region,
            accessKeyId: AccessKeyId、
            accessKeySecret: AccessKeySecret、
            stsToken: SecurityToken、
            リフレッシュSTokenInterval: 9000、
          });
          // バケットにアップロードするオブジェクトの名前を指定します。 
          const url = client.asyncSignatureUrl("example.txt", {
            有効期限: 3600、
            メソッド: "PUT" 、
            // Content-Typeを指定します。 
            "Content-Type": "text/plain;charset=UTF-8" 、
          });
          console.log("url:" 、url);
          // client.put("example.txt", Buffer.from("body")).then((res) => {
          // console.log("res", res.url);
          // });
        });
    };
    getSts();
    
  2. 署名付きURLを使用してオブジェクトをアップロードします。

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title> ドキュメント </title>
      </head>
      <body>
        <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
        <script>
          // ステップ1で生成された署名付きURLを入力します。 
          const url = "yourSignatureUrl";
    
          var xhr = new XMLHttpRequest();
          xhr.open("PUT" 、url、true);
    
          xhr.onload = function () {
            // さらなる操作のコードを追加します。 
          };
    
          // xhr.send(null);
          xhr.send("string");
          // xhr.send (新しいBlob());
          // xhr.send (新しいInt8Array());
          // xhr.send({ form: 'data' });
          // xhr.send (ドキュメント);
        </script>
      </body>
    </html>
    

参考資料

  • STSを使用して一時的なアクセスを許可するために使用される完全なサンプルコードについては、GitHubをご覧ください。

  • 署名付きURLを使用して一時的なアクセスを許可するために使用される完全なサンプルコードについては、GitHubをご覧ください。