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

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

最終更新日:Oct 11, 2024

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

権限の付与方法

OSSは、クライアントに対して複数の権限付与方法をサポートしています。 次のセクションでは、3つの承認方法について説明し、承認方法を使用して簡易アップロードを実行するためのサンプルコードを示します。 認証および権限付与の要件に基づいて、対応する権限付与方法を参照できます。

承認方法

プロセス

シナリオ

補足

方法1: アプリケーションサーバーのSTSから一時的なアクセス資格情報を取得

  1. クライアントは、アプリケーションサーバーに一時的なアクセス資格情報を要求します。

  2. アプリケーションサーバーはSTS SDKを使用してAssumeRole操作を呼び出し、一時的なアクセス資格情報を取得します。

  3. STSは一時的なアクセス資格情報を生成してアプリケーションサーバーに返します。

  4. アプリケーションサーバーは、一時的なアクセス資格情報をクライアントに返します。

  5. クライアントは、OSS SDKを使用して、一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードします。

  6. OSSは成功応答をクライアントに返します。

ほとんどのオブジェクトアップロードのシナリオでは、STS SDKを使用してアプリケーションサーバーの一時的なアクセス資格情報を取得し、一時的なアクセス資格情報とOSS SDKを使用してクライアントからOSSに直接オブジェクトをアップロードすることを推奨します。 クライアントは、アプリケーションサーバ上の一時的なアクセス資格情報を再利用して署名を生成することができる。 これは、マルチパートアップロードと再開可能アップロードを使用してラージオブジェクトをアップロードするシナリオに適しています。

STSへの頻繁な呼び出しは、スロットリングを引き起こす可能性があります。 したがって、STSから取得した一時的なアクセス資格情報をキャッシュし、有効期間が終了する前に更新することをお勧めします。 クライアントでの一時的なアクセス資格情報の悪用をさらに防ぐために、一時的なアクセス資格情報の使用を制限する追加のポリシーを構成することを推奨します。

方法2: アプリケーションサーバーからPostObject操作の署名とアップロードポリシーを取得する

  1. クライアントは、署名やアップロードポリシーなどの情報をアプリケーションサーバに要求する。

  2. アプリケーションサーバーは、署名やアップロードポリシーなどの情報を生成してクライアントに返します。

  3. クライアントは、署名やアップロードポリシーなどの情報を使用してPostObject操作を呼び出し、HTMLフォームを使用してオブジェクトをOSSにアップロードします。

  4. OSSは成功応答をクライアントに返します。

アップロードするオブジェクトの属性を制限するシナリオでは、署名やアップロードポリシーなどの必要な情報をアプリケーションサーバーから取得します。 これにより、クライアントはOSS SDKを使用せずにオブジェクトをOSSに直接アップロードできます。 サーバーが生成するアップロードポリシーでは、オブジェクトのサイズやタイプなど、OSSにアップロードするオブジェクトの属性に制限を課すことができます。 この方法は、HTMLフォームを使用してオブジェクトをアップロードするシナリオに適しています。

このソリューションは、マルチパートアップロードと再開可能アップロードをサポートしていません。

方法3: アプリケーションサーバーからPutObject操作の署名付きURLを取得する

  1. クライアントは、アプリケーションサーバーに署名付きURLを要求します。

  2. アプリケーションサーバーは、OSS SDKを使用してPUTリクエストの署名付きURLを生成し、署名付きURLをクライアントに返します。

  3. クライアントは署名付きURLを使用してPutObject操作を呼び出し、オブジェクトをOSSにアップロードします。

  4. OSSは成功応答をクライアントに返します。

単純なオブジェクトアップロードのシナリオでは、アプリケーションサーバーでOSS SDKを使用して、PutObject操作を呼び出すために必要な署名付きURLを取得できます。 その後、クライアントは署名付きURLを使用して、OSS SDKを使用せずにオブジェクトをアップロードできます。

このソリューションは、マルチパートアップロードと再開可能アップロードをサポートしていません。 アプリケーションサーバは、各部分の署名付きURLを生成し、署名付きURLをクライアントに返す。 これは、アプリケーションサーバとの対話の数およびネットワーク要求の複雑さを増大させる。 さらに、クライアントは、部分の内容または順序を修正することができ、その結果、無効な結合オブジェクトが生じる。

アプリケーションサーバーのSTSから一時的なアクセス資格情報を取得する

重要

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

処理中

image

以下の例は、コアコードブロックのみを提供する。 完全なサンプルコードについては、sts.zipパッケージをダウンロードしてください。

サーバー側のサンプルコード

次のサンプルコードは、アプリケーションサーバーがSTSから一時的なアクセス資格情報を取得する方法の例を示しています。

Java

com.aliyun.sts20150401.Clientをインポートします。import com.aliyun.sts20150401.mo dels.AssumeRoleRequest;
import com.aliyun.sts20150401.mo dels.AssumeRoleResponse;
import com.aliyun.sts20150401.mo dels.AssumeRoleResponseBody;
com.aliyun.tea.TeaExceptionをインポートします。com.aliyun.teautil.mo dels.RuntimeOptionsをインポートします。org.springframework.beans.factory.annotation.Autowired;
org.springframework.web.bind.annotation.GetMappingをインポートします。org.springframework.web.bind.annotation.RestControllerをインポートします。com.aliyun.teaopenapi.mo dels.Configをインポートします。org.springframework.context.annotation.Beanをインポートします。org.springframework.context.annotation.Configurationをインポートします。静的com.aliyun.teautil.Common.assertAsStringをインポートします。@ RestController
public class StsController {

    @Autowired
    privateクライアントstsClient;

    @ GetMapping("/get_sts_token_for_oss_upload")
    public AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials generateStsToken() {
        AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
            . setDurationSeconds(3600L)
            // <YOUR_ROLE_SESSION_NAME> をmy-website-serverなどのカスタムセッション名に置き換えます。 
            . setRoleSessionName("<YOUR_ROLE_SESSION_NAME>")
            // <YOUR_ROLE_ARN> を、指定されたバケットにオブジェクトをアップロードする権限を持つRAMロールのAlibaba Cloud Resource Name (ARN) に置き換えます。 RAMロールのARNは、RAMロールの詳細ページで取得できます。 
        RuntimeOptions runtime = new RuntimeOptions();
        try {
            AssumeRoleResponseレスポンス=stsClient.assumeRoleWithOptions(assumeRoleRequest、ランタイム);
            response.body.credentialsを返します。
        } catch (TeaExceptionエラー) {
            // ビジネス要件に基づいてエラーを表示します。
            assertAsString(error.message);
            return null;
        } catch (例外エラー) {
            TeaExceptionエラー=new TeaException(_error.getMessage(), _error);
            // ビジネス要件に基づいてエラーを表示します。
            assertAsString(error.message);
            return null;
        }
    }
}

@ 設定
publicクラスStsClientConfiguration {

    @Bean
    publicクライアントstsClient() {
        // 資格情報クライアントを初期化するときにパラメーターを指定しない場合、資格情報ツールはデフォルトの資格情報チェーンを使用してクライアントを初期化します。 
        Config config = new Config();
        config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
        try {
            com.aliyun.credentials.Client credentials = new com.aliyun.credentials.Client();
            config.setCredential (資格情報);
            新しいクライアント (config) を返します。
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

Node.js

const express = require("express");
const { STS } = require('ali-oss ');

const app = express();
const path = require("path");

app.us e(express.static(path.join(__dirname, "templates")));
// ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
const accessKeyId = process.env.ALIBABA_CLOUD_ACCESS_KEY_ID;
// ALIBABA_CLOUD_ACCESS_SECRET環境変数からAccessKeyシークレットを取得します。 
const accessKeySecret = process.env.ALIBABA_CLOUD_ACCESS_SECRET;

app.get('/get_sts_token_for_oss_upload', (req, res) => {
  let sts=新しいSTS({
   accessKeyId: accessKeyId、
   accessKeySecret: accessKeySecret
 });
   // 手順2で取得したロールのARNを指定します。 例: acs:ram::175708322470 ****:role/ramtest。 
   // カスタムポリシーを指定して、一時的なアクセス資格情報の権限を制限します。 カスタムポリシーを指定しない場合、返される一時的なアクセス資格情報は、指定されたRAMロールの完全な権限を持ちます。 
   // 一時的なアクセス資格情報の有効期間を指定します。 この例では、有効期間は3,000秒に設定されています。 
   // さまざまなトークンを区別するために使用されるカスタムロールセッション名を指定します。 例: sessiontest。 
   sts.assumeRole('<YOUR_ROLE_ARN>', '', '3000', 'sessiontest').then((result) => {
     console.log (結果);
     res.json({
       AccessKeyId: result.credentials.AccessKeyId、
       AccessKeySecret: result.credentials.AccessKeySecret、
       SecurityToken: result.credentials.SecurityToken,
     });
   }).catch((err) => {
     console.log(err);
     res.status(400).json(err.message);
   });
 });

app.listen(8000, () => {
  console.log("http:// 127.0.0.1:8000");
});

Python

import json
alibabacloud_tea_openapi.modelsからのインポートConfig
alibabacloud_sts20150401.clientからSts20150401Clientとしてのインポートクライアント
alibabacloud_sts20150401からモデルをsts_20150401_modelsとしてインポートする
alibabacloud_credentials.clientからCredentialClientとしてのインポートクライアント

# <YOUR_ROLE_ARN> を、オブジェクトをOSSバケットにアップロードする権限を持つRAMロールのARNに置き換えます。 
role_arn_for_oss_upload = '<YOUR_ROLE_ARN>'
# <YOUR_REGION_ID> をSTSがデプロイされているリージョンのIDに置き換えます。 例:cn-hangzhou。 
region_id = '<YOUR_REGION_ID>'

def get_sts_token():
    # CredentialClientの初期化時にパラメーターを指定しない場合、デフォルトの資格情報チェーンが使用されます。 
    # ローカルコンピューターでプログラムを実行している場合は、環境変数と環境変数からAccessKeyペアを取得できます。
    # Elastic Compute Service (ECS) またはElastic Container Instanceでプログラムを実行する場合、ALIBABA_CLOUD_ECS_METADATA環境変数を設定することで、バインドされたインスタンスのロールを指定できます。 SDKはSTSから一時的なアクセス資格情報を自動的に取得します。 
    config = Config(region_id=region_id, credential=CredentialClient())
    sts_client = Sts20150401Client(config=config)
    assume_role_request = sts_20150401_models.AssumeRoleRequest (
        role_arn=role_arn_for_oss_upload、
        # <YOUR_ROLE_SESSION_NAME> をoss-role-sessionなどのカスタムセッション名に置き換えます。 
        role_session_name='<YOUR_ROLE_SESSION_NAME>'
    )
    response = sts_client.assume_role(assume_role_request)
    token = json.dumps(response.body.credentials.to_map())
    リターントークン

Go

パッケージメイン

import (import (import)
    "encoding/json"
    "net/http"
    "os"

    openapi「github.com/alibabacloud-go/darabonba-openapi/v2/client」
    sts20150401「github.com/alibabacloud-go/sts-20150401/v2/client」
    util "github.com/alibabacloud-go/tea-utils/v2/service"
    「github.com/alibabacloud-go/tea/tea」
)

/**
 * AccessKey IDとAccessKeyシークレットを使用して、クライアントを初期化します。
 * @ param accessKeyId
 * @ param accessKeySecret
 * @ returnクライアント
 * @throws Exception
 * /
func CreateClient(accessKeyId * string, accessKeySecret * string) (* sts20150401.Client, error) {
    config := &openapi.Config {
    // Required. AccessKey IDを指定します。
    AccessKeyId: accessKeyId、
    // Required. AccessKeyシークレットを指定します。
    AccessKeySecret: accessKeySecret、
    }
    // バケットが配置されているリージョンのエンドポイントを指定します。 詳細については、https://api.aliyun.com/product/Sts. をご覧ください。
    config.Endpoint = tea.String("sts.cn-hangzhou.aliyuncs.com")
    sts20150401.NewClient(config) を返します。}

func AssumeRole (クライアント * sts20150401.Client) (* sts20150401.AssumeRoleResponse, error) {
    assumeRoleRequest := &sts20150401.AssumeRoleRequest {
    DurationSeconds: tea.Int64(3600) 、
    RoleArn: tea.String("acs:ram::1379186349531844:role/admin-oss") 、
    RoleSessionName: tea.String("peiyu-demo") 、
    }
    return client.AssumeRoleWithOptions(assumeRoleRequest, &util.RuntimeOptions{})
}

func handler(w http.ResponseWriter, r * http.Request) {
    if r.URL.Path == "/" {
    http.ServeFile(w、r、"templates/index.html")
    リターン
    } else if r.URL.Path == "/get_sts_token_for_oss_upload" {
    client, err := CreateClient(tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))))
    if err! =nil {
    panic(err)
    }
    assumeRoleResponse, err := AssumeRole (クライアント)
    if err! =nil {
    panic(err)
    }
    responseBytes, err := json.Marshal(assumeRoleResponse)
    if err! =nil {
    panic(err)
    }
    w.Header().Set("Content-Type", "application/json")
    w. 書き込み (responseBytes)
    リターン
    }
    http.NotFound(w, r)
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

PHP

<?php
require_once 'vendor/autoload.php';
Alibaba Cloud\Client\Alibaba Cloudを使用します。listaCloud \Client\Exception\ClientExceptionを使用します。listaCloud \Client\Exception\ServerExceptionを使用します。Alibaba Cloud\Sts\Sts; を使用します。// Alibaba Cloudクライアントを初期化します。 
Alibaba Cloud::accessKeyClient(getenv('ALIBABA_CLOUD_ACCESS_KEY_ID '), getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'))
    ->regionId('cn-hangzhou')
    ->asDefaultClient();
// STSから一時的なアクセス資格情報を取得するリクエストを作成します。 
$request = Sts::v20150401()->assumeRole();
// STSリクエストを開始し、結果を取得します。 
// <YOUR_ROLE_SESSION_NAME> をoss-role-sessionなどのカスタムセッション名に置き換えます。 
// <YOUR_ROLE_ARN> を、指定したバケットにオブジェクトをアップロードする権限を持つRAMロールのARNに置き換えます。 
$result = $request
    ->withRoleSessionName("<YOUR_ROLE_SESSION_NAME>")
    ->withDurationSeconds(3600)
    ->withRoleArn("<YOUR_ROLE_ARN>")
    ->request();
// STSリクエスト結果の資格情報を取得します。 
$credentials = $result->get('Credentials');
// 返された結果からJSONデータを作成します。 
$response = [
    'AccessKeyId' => $資格情報 ['AccessKeyId'] 、
    'AccessKeySecret' => $資格情報 ['AccessKeySecret'] 、
    'SecurityToken' => $credentials['SecurityToken'] 、];
// Content-Typeレスポンスヘッダーをapplication/jsonに設定します。 
ヘッダー ('Content-Type: application/json');
// 結果をJSONデータに変換し、結果を出力します。 
echo json_encode(['Credentials' => $response]);
?>

Ruby

は「シナトラ」を必要とする
'base64' が必要
「open-uri」が必要です
「cgi」が必要
'openssl' が必要
'json' が必要
「sinatra/reloader」が必要です
'sinatra/content_for 'が必要です
「aliyunsdkcore」が必要です

# パブリックフォルダーのパスを、現在のフォルダー内のテンプレートサブフォルダーに設定します。
set :public_folder, File.dirname(__FILE__) + '/templates'

def get_sts_token_for_oss_upload()
  client = RPCClient.new (
    # ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
    access_key_id: ENV['ALIBABA_CLOUD_ACCESS_KEY_ID '] 、
    # ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKey secretを取得します。 
    access_key_secret: ENV['ALIBABA_CLOUD_ACCESS_KEY_SECRET '] 、
    エンドポイント: 'https:// sts.cn-hangzhou.aliyuncs.com '、
    api_version: '2015-04-01'
  )
  response = client.request (
    アクション: 'AssumeRole' 、
    params: {
      # 手順2で取得したRAMロールのARNを指定します。 例: acs:ram::175708322470 ****:role/ramtest。 
      "RoleArn": "acs:ram::175708322470 ****:role/ramtest" 、
      # 一時アクセス資格情報の有効期間を指定します。 この例では、有効期間は3,600秒に設定されています。 
      "DurationSeconds": 3600、
      # さまざまなトークンを区別するために使用されるカスタムロールセッション名を指定します。 例: sessiontest。 
      "RoleSessionName": "sessiontest"
    },
    opts: {
      method: 'POST',
      format_params: true
    }
  )
終了

ARGV.length === 1の場合 
  $server_port = ARGV[0]
elsif ARGV.length == 2
  $server_ip = ARGV[0]
  $server_port = ARGV[1]
終了

$server_ip = "0.0.0.0"
$server_port = 8000

puts "App server is running on: http:// #{$ server_ip }:#{$ server_port}"

set :bind, $server_ip
set :port, $server_port

get '/get_sts_token_for_oss_upload' do
  token = get_sts_token_for_oss_upload()
  response = {
    "AccessKeyId" => トークン ["資格情報"]["AccessKeyId"] 、
    "AccessKeySecret" => トークン ["資格情報"]["AccessKeySecret"] 、
    "SecurityToken" => token["Credentials"]["SecurityToken"]
  }
  レスポンス. to_json
終了

'/*' を取得する
  「 ********************* GET」を置く
  ファイル. join(settings.public_folder, 'index.html ')
終了 

C#

Microsoft.AspNetCore.Builderを使用した

;
Microsoft.AspNetCore.Http; を使用
Microsoft.Extensions.DependencyInjectionを使用します。Microsoft.Extensions.Logging; を使用して
Aliyun.OSSを使用します。システムを使用して;
System.IOを使用する。listaCloud. SDK.Sts20150401を使用
System.Text.Jsonを使用する。名前空間YourNamespace
{
    公共クラスプログラム
    {
        プライベートILogger<Program> _logger;
        public static listaCloud. SDK.Sts20150401.Client CreateClient(string accessKeyId, string accessKeySecret)
        {
            var config = new Alibaba Cloud.OpenApiClient.Models.Config
            {
                AccessKeyId = accessKeyId、
                AccessKeySecret = accessKeySecret、
                エンドポイント="sts.cn-hangzhou.aliyuncs.com"
            };
            新しいAlibaba Cloud.SDK.Sts20150401.Client(config) を返します。
        }
        public static voidメイン (string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();
            builder.Logging.AddConsole();
            var serviceProvider = builder.Services.BuildServiceProvider();
            var logger = serviceProvider.GetRequiredService<ILogger <プログラム>>();
            app.UseStaticFiles();
            app.MapGet("/", async (context) =>
            {
                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "templates/index.html");
                var htmlContent = await File.ReadAllTextAsync(filePath);
                コンテキストを待ちます。Response.WriteAsync(htmlContent);
                logger.LogInformation("GET request to root path");
            });
            app.MapGet("/get_sts_token_for_oss_upload", async (コンテキスト) =>
            {
                var program=新しいプログラム (ロガー);
                var client = CreateClient(Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"), Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                var assumeRoleRequest = new Alibaba Cloud.SDK.Sts20150401.Models.AssumeRoleRequest();
                // <YOUR_ROLE_SESSION_NAME> をoss-role-sessionなどのカスタムセッション名に置き換えます。 
                assumeRoleRequest.RoleSessionName = "<YOUR_ROLE_SESSION_NAME>";
                // <YOUR_ROLE_ARN> を、指定したバケットにオブジェクトをアップロードする権限を持つRAMロールのARNに置き換えます。 
                assumeRoleRequest。RoleArn = "<YOUR_ROLE_ARN>";
                assumeRoleRequest.DurationSeconds = 3600;
                var runtime = new Alibaba Cloud.TeaUtil.Models.RuntimeOptions();
                var response = client.AssumeRoleWithOptions(assumeRoleRequest, runtime);
                var credentials = response.Body.Credentials;
                var jsonResponse = JsonSerializer.Serialize(new)
                {
                    AccessKeyId=資格情報。AccessKeyId、
                    AccessKeySecret=認証情報。AccessKeySecret,
                    有効期限=資格情報。有効期限、
                    SecurityToken = credentials。SecurityToken
                });
                context.Response.ContentType = "application/json";
                コンテキストを待ちます。Response.WriteAsync(jsonResponse);
            });
            app.Run();
        }
        public Program(ILogger<Program> logger)
        {
            _logger = logger;
        }
    }
}

クライアント側のサンプルコード

次のサンプルコードは、一時的なアクセス資格情報を使用して、webクライアントからオブジェクトをOSSにアップロードする方法の例を示しています。

let credentials = null;
const form = document.querySelector("form");
form.addEventListener("submit", async (event) => {
  event.preventDefault();
  // 有効期限が切れた場合にのみ一時的なアクセス資格情報を再取得します。 これにより、STSへの呼び出し数が減少します。 
  if (isCredentialsExpired (資格情報)) {
    const応答=await fetch("/get_sts_token_for_oss_upload", {
      メソッド: "GET" 、
    });
    if (!response.ok) {
      // HTTPステータスコードで示されるエラーを処理します。 
      新しいエラーを投げる (
        'STSトークンの取得に失敗しました: ${response.status} ${response.statusText}'
      );
    }
    credentials = await response.json();
  }
  const client = new OSS({
    // <YOUR_BUCKET> をOSSバケットの名前に置き換えます。 
    bucket: "<YOUR_BUCKET>" 、
    // <YOUR_REGION> を、OSSバケットが配置されているリージョンのIDに置き換えます。 例: oss-cn-hangzhou. 
    region: "oss-<YOUR_REGION>" 、
    accessKeyId: 認証情報。AccessKeyId、
    accessKeySecret: 認証情報。AccessKeySecret,
    stsToken: 資格情報。SecurityToken、
  });

  const fileInput = document.querySelector("#file");
  const file = fileInput.files[0];
  const result = await client.pu t(file.name、ファイル);
  console.log (結果);
});

/**
 * 一時アクセス資格情報の有効期限が切れるかどうかを確認します。 
 **/
関数isCredentialsExpired (資格情報) {
  if (! 資格情報) {
    return true;
  }
  const expireDate = new Date(credentials.Expiration);
  const now = new Date();
  // 一時的なアクセス資格情報の残りの有効期間が1分未満の場合、一時的なアクセス資格情報は期限切れと見なされます。 
  を返すexpireDate.getTime() - now.getTime() <= 60000;
} 

アプリケーションサーバーからPostObject操作の署名とアップロードポリシーを取得する

処理中

image

以下の例は、コアコードブロックのみを提供する。 完全なサンプルコードについては、postsignature.zipパッケージをダウンロードしてください。

サーバー側のサンプルコード

次のサンプルコードは、アプリケーションサーバーがPostObject操作の署名とアップロードポリシーを生成する方法の例を示しています。

Java

com.aliyun.help.de mo.uploading_to_oss_directly_postsignature.config.OssConfigをインポートします。com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。com.aliyun.oss.OSSExceptionをインポートします。impor t com.aliyun.oss.com mon.utils.BinaryUtil;
com.aliyun.oss.mo del.MatchModeをインポートします。com.aliyun.oss.mo del.PolicyConditionsをインポートします。org.springframework.beans.factory.annotation.Autowired;
org.springframework.stereotype.Controllerをインポートします。org.springframework.web.bind.annotation.GetMappingをインポートします。org.springframework.web.bind.annotation.ResponseBodyをインポートします。org.codehaus.jettison.json.JSONObjectをインポートします。java.util.Dateをインポートします。com.aliyun.oss.OSSClientBuilderをインポートします。org.springframework.context.annotation.Configurationをインポートします。org.springframework.context.annotation.Beanをインポートします。javax.annotation.PreDestroyをインポートします。@ コントローラー
public class PostSignatureController {
    @Autowired
    プライベートOSS ossClient;

    @Autowired
    プライベートOssConfig ossConfig;

    @ GetMapping("/get_post_signature_for_oss_upload")
    @ResponseBody
    public String generatePostSignature() {
        JSONObject response = new JSONObject();
        try {
            long expireEndTime = System.currentTimeMillis() + ossConfig.getExpireTime() * 1000;
            日付の有効期限=新しい日付 (expireEndTime);
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossConfig.getDir());
            String postPolicy = ossClient.generatePostPolicy (有効期限、policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = ossClient.ca lculatePostSignature(postPolicy);
            response.put("ossAccessKeyId", ossConfig.getAccessKeyId());
            response.put("policy", encodedPolicy);
            response.put("signature", postSignature);
            response.put("dir", ossConfig.getDir());
            response.put("host", ossConfig.getHost());
        } キャッチ (
    OSSException oe) {
        System.out.println("Caught an OSSException, which means your request made it to OSS, "
                + "しかし、何らかの理由でエラー応答で拒否されました。");
        // メソッドが存在すると仮定します。
        System.out.println("HTTPステータスコード:" + oe.getRawResponseError()); 
        System.out.println("エラーメッセージ:" + oe.getErrorMessage());
        System.out.println("Error Code:       " + oe.getErrorCode());
        System.out.println("Request ID:      " + oe.getRequestId());
        System.out.println("Host ID:           " + oe.getHostId());
    } catch (ClientException e) {
        System.out.println("Caught an ClientException, which means the client encountered "
                + "a serious internal problem while trying to communicate with OSS, "
                + 「ネットワークにアクセスできないなど」;
        System.out.println("Error Message: " + ce.getMessage());
    } 最後に{
        if (ossClient != null) {
            ossClient.shutdown();
        }
        return response.toString();
    }
  }
}

@ 設定
public class OssConfig {
    /**
     * <YOUR-ENDPOINT> をs oss-cn-hangzhou.aliyuncs.comなど、バケットが配置されているリージョンのエンドポイントに置き換えます。
     */
    プライベート文字列エンドポイント="<YOUR-ENDPOINT>";
    /**
     * <YOUR-BUCKET> をバケットの名前に置き換えます。
     */
    プライベートString bucket = "<YOUR-BUCKET>";
    /**
     * OSSのオブジェクトの名前にプレフィックスを指定します。
     */
    プライベート文字列dir = "user-dir-prefix/";
    /**
     * 有効期間を指定します。 単位は秒です。
     */
    プライベートlong expireTime = 3600;
    /**
     * hostパラメーターを指定します。
     */
    private String host = "http://" + bucket + "" 。+ エンドポイント;
    /**
     * ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。
     */
    private String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    /**
     * ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKeyシークレットを取得します。
     */
    private String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");

    プライベートOSS ossClient;
    @Bean
    パブリックOSS getOssClient() {
        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClientを返します。
    }
    @Bean
    public String getHost() {
        ホストを返します。
    }
    @Bean
    public String getAccessKeyId() {
        accessKeyIdを返します。
    }
    @Bean
    public long getExpireTime() {
        リターンexpireTime;
    }
    @Bean
    public String getDir() {
        dirを返します。
    }

    @ PreDestroy
    public void onDestroy() {
        ossClient.shutdown();
    }
}

Node.js

const express = require("express");
const { Buffer } = require("buffer");
const OSS = require("ali-oss");
const app = express();
const path = require("path");
const config = {
  // ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
  accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID、
  // ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKeyシークレットを取得します。 
  accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET、
  // <YOUR-BUCKET> をバケットの名前に置き換えます。 
  bucket: "<YOUR-BUCKET>" 、
  // OSSにアップロードするオブジェクトの名前にプレフィックスを指定します。 
  dir: "prefix/" 、};

app.us e(express.static(path.join(__dirname, "templates")));

app.get("/get_post_signature_for_oss_upload", async (req, res) => {
  const client = new OSS(config);
  const date = new Date();
  // 署名の有効期間を指定します。 単位は秒です。 
  date.setSeconds(date.getSeconds() + 3600);
  const policy = {
    有効期限: date.toISOString() 、
    条件: [
      // アップロードできるオブジェクトの最小サイズと最大サイズを指定します。 
      ["content-length-range", 0, 1048576000],
      // オブジェクトをアップロードするバケットを指定します。 
      {bucket: client.options.bucket },
    ],
  };
  const formData = awai t client.ca lculatePostSignature (ポリシー);
  const host = 'http://${config.bucket}.${
    (await client.getBucketLocation()).location
  } .aliyuncs.com '.toString();
  const params = {
    policy: formData.policy、
    signature: formData.Signature,
    ossAccessKeyId: formData.OSSAccessKeyId、
    ホスト、
    dir: config.dir,
  };
  res.json(params);
});

app.get(/^(.+)*\.(html | js)$/i, async (req, res) => {
  res.sendFile(path.join(__dirname, "./templates", req.originalUrl));
});

app.listen(8000, () => {
  console.log("http:// 127.0.0.1:8000");
});

Python

osのインポート
hashlibからsha1をshaとしてインポート
jsonのインポート
インポートbase64
hmacのインポート
datetimeのインポート
インポート時間

# OSS_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
access_key_id = os.environ.get('OSS_ACCESS_KEY_ID ')
# OSS_ACCESS_KEY_SECRET環境変数からAccessKey secretを取得します。 
access_key_secret = os.environ.get('OSS_ACCESS_KEY_SECRET ')
# <YOUR_BUCKET> をバケットの名前に置き換えます。 
bucket = '<YOUR_BUCKET>'
# hostパラメーターをbucketname.endpoint形式で指定します。 <YOUR_BUCKET> をバケットの名前に置き換えます。 <YOUR_ENDPOINT> を、s oss-cn-hangzhou.aliyuncs.comなど、バケットが配置されているリージョンのエンドポイントに置き換えます。 
host = 'https://<YOUR_BUCKET>.<YOUR_ENDPOINT>'
# OSSにアップロードするオブジェクトの名前にプレフィックスを指定します。 
upload_dir = 'user-dir-prefix/'
# 有効期間を指定します。 単位は秒です。 
expire_time = 3600


def generate_expailation (秒):
    """
    有効期限は、指定された有効期間に基づいて計算されます。 単位は秒です。 
    : param seconds: 有効期間 (秒) 。 
    : return: ISO 8601標準の時間文字列。 例: 2014-12-01T12:00:00.000Z 
    """
    now = int(time.time())
    expiration_time = now + 秒
    gmt = datetime.datetime.utcfromtimestamp(expiration_time). isofformat ()
    gmt += 'Z'
    gmtを返す


def generate_signature(access_key_secret、有効期限、条件、policy_extra_props=なし):
    """
    署名文字列を生成します。 
    : param access_key_secret: バケットへのアクセス権限を持つAccessKeyシークレット。 
    : param expiration: 署名の有効期限が切れる時刻。 時刻を ISO 8601 規格 (yyyy-MM-ddTHH:mm:ssZ) の形式で指定します。 例: 2014-12-01T12:00:00.000Z 
    : param条件: フォームのアップロード時に指定できる値を制限するために使用できるポリシー条件。 
    : param policy_extra_props: 追加のポリシーパラメーター。 追加のパラメータをdictとして渡すことができます。 
    : return: 署名文字列。 
    """
    policy_dict = {
        'expiration': 有効期限、
        'conditions': 条件
    }
    policy_extra_propsがNoneでない場合:
        policy_dict.update(policy_extra_props)
    policy = json.dumps(policy_dict).strip()
    policy_encode = base64.b64encode(policy.encode())
    h = hmac.new(access_key_secret.encode(), policy_encode, sha)
    sign_result = base64.b64encode(h.digest()).strip()
    リターンsign_result.decode()

def generate_upload_params():
    policy = {
        # 有効期間を指定します。 
        "expailation": generate_expailation (expire_time) 、
        # ポリシー条件を指定します。 
        "conditions": [
            # success_action_redirectが指定されていない場合、オブジェクトのアップロード後にHTTPステータスコード204が返されます。 
            ["eq" 、"$success_action_status" 、"200"] 、
            # フォームフィールドの値は、指定されたプレフィックスで始まる必要があります。 たとえば、キーフォームフィールドの値がuser/user1で始まる場合、条件は ["starts-with", "$key", "user/user1"] です。 
            ["starts-with" 、"$key" 、upload_dir] 、
            # アップロードできるオブジェクトの最小サイズと最大サイズを指定します。 単位はバイトです。 
            ["content-length-range", 1, 1000000],
            # アップロードするオブジェクトのタイプを指定したイメージタイプに設定します。
            ["in", "$content-type", ["image/jpg", "image/png"]]
        ]
    }
    signature = generate_signature(access_key_secret, policy.get('expiration'), policy.get('conditions'))
    response = {
        'policy': base64.b64encode(json.dumps(policy).encode('utf-8 ')).decode() 、
        'ossAccessKeyId': access_key_id、
        'signature': signature、
        'host ': ホスト、
        'dir': upload_dir
        # 追加のパラメーターを指定します。
    }
    を返すjson.dumps (応答)

Go

パッケージメイン

import (import (import)
    "crypto/hmac"
    "crypto/sha1"
    "encoding/base64"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
    「時間」
)

var (
    // ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
    accessKeyId = os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
    // ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKeyシークレットを取得します。 
    accessKeySecret = os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    // hostパラメーターを指定します。 形式: BucketName.Endpoint. ${your-bucket} をバケットの名前に置き換えます。 ${your-endpoint} をs oss-cn-hangzhou.aliyuncs.comなどのOSSエンドポイントに置き換えます。 
    host = "http://${your-bucket}.${your-endpoint}"
    // OSSにアップロードするオブジェクトの名前にプレフィックスを指定します。 
    uploadDir = "user-dir-prefix/"
    // 有効期間を指定します。 単位は秒です。 
    expireTime = int64(3600)
)

タイプConfigStruct struct {
    有効期限文字列 'json:"Expiration"'
    Conditions [][]string 'json:"conditions"'
}
型PolicyToken struct {
    AccessKeyId文字列 'json:"ossAccessKeyId"'
    ホスト文字列 'json:"Host"'
    署名文字列 'json:"Signature"'
    ポリシー文字列 'json:"Policy"'
    ディレクトリ文字列 'json:"dir"'
}

func getGMTISO8601(expireEnd int64) string {
    return time.Unix(expireEnd, 0).UTC().Format("2006-01-02T15:04:05Z")
}
func getPolicyToken() string {
    now := time.Now().Unix()
    expireEnd := now + expireTime
    tokenExpire := getGMTISO8601(expireEnd)
    var config ConfigStruct
    config.Expiration = tokenExpire
    var condition []string
    condition = append(condition, "starts-with")
    condition = append(condition, "$key")
    condition = append(condition, uploadDir)
    config.Conditions = append(config.Conditions, condition)
    result, err := json.Marshal(config)
    if err! =nil {
    fmt.Println("callback json err:", err)
    return ""
    }
    encodedResult := base64.StdEncoding.EncodeToString(result)
    h := hmac.New(sha1.New, [] バイト (accessKeySecret))
    io.WriteString(h, encodedResult)
    signedStr := base64.StdEncoding.EncodeToString(h.Sum(nil))
    policyToken := PolicyToken {
    AccessKeyId: accessKeyId、
    ホスト: ホスト、
    署名: signedStr、
    ポリシー: encodedResult、
    ディレクトリ: uploadDir、
    }
    response, err := json.Marshal(policyToken)
    if err! =nil {
    fmt.Println("json err:", err)
    return ""
    }
    戻り文字列 (応答)
}
func handler(w http.ResponseWriter, r * http.Request) {
    if r.URL.Path == "/" {
    http.ServeFile(w、r、"templates/index.html")
    リターン
    } else if r.URL.Path == "/get_post_signature_for_oss_upload" {
    policyToken := getPolicyToken()
    w.Header().Set("Content-Type", "application/json")
    w. 書き込み ([] バイト (policyToken))
    リターン
    }
    http.NotFound(w, r)
}
func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

PHP

<?php
関数gmt_iso8601($time)
{
    str_replace('+ 00:00', '.000Z', gmdate('c', $time)) を返します。}

// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_IDとALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
$accessKeyId = getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
$accessKeySecret = getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// $hostパラメーターを指定します。 フォーマット: <YOUR-BUCKET>.<YOUR-ENDPOINT> 。 
$host = 'http:// <あなたのバケット> 。<YOUR-ENDPOINT>';
// アップロードするオブジェクトの名前にプレフィックスを指定します。 
$dir = 'user-dir-prefix/';

$now = time();
// ポリシーの有効期間を指定します。 有効期間が終了すると、アクセスは拒否されます。 この例では、有効期間は10秒に設定されています。 
$expire = 30;
$end = $now + $expire;
$expailation=gmt_iso8601( $end );

// アップロードできるオブジェクトの最大サイズを指定します。 
$条件=配列 (0 => 'content-length-range', 1 => 0, 2 => 1048576000);
$conditions[] = $condition;

// アップロードできるオブジェクトを指定します。 この例では、名前が $dirパラメーターの値で始まるオブジェクトのみをアップロードできます。 これは、ポリシーを使用してオブジェクトがバケット内の別のディレクトリにアップロードされないようにするオプションの設定です。 
$start = array(0 => 'starts-with' 、1 => '$key' 、2 => $dir);
$conditions[] = $start;


$arr = array('expiration' => $expiration, 'conditions' => $conditions);
$policy = json_encode($arr);
$base64_policy = base64_encode($policy);
$string_to_sign = $base64_policy;
$signature = base64_encode(hash_hmac('sha1', $string_to_sign, $accessKeySecret, true));

$response = array();
$response['ossAccessKeyId'] = $accessKeyId;
$response['host'] = $host;
$response['policy'] = $base64_policy;
$response['signature'] = $signature;
$response['dir'] = $dir;
echo json_encode($response);

Ruby

は「シナトラ」を必要とする
'base64' が必要
「open-uri」が必要です
「cgi」が必要
'openssl' が必要
'json' が必要
「sinatra/reloader」が必要です
'sinatra/content_for 'が必要です

# パブリックフォルダーのパスを、現在のフォルダー内のテンプレートサブフォルダーに設定します。
set :public_folder, File.dirname(__FILE__) + '/templates'

# ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
$access_key_id = ENV['ALIBABA_CLOUD_ACCESS_ID ']
# ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKey secretを取得します。 
$access_key_secret = ENV['ALIBABA_CLOUD_ACCESS_SECRET ']

# $hostパラメーターを指定します。 形式: <bucketname>.<endpoint> 
$host = 'http://<bucketname>.<endpoint>';

# アップロードするオブジェクトの名前にプレフィックスを指定します。 
$upload_dir = 'user-dir-prefix/'
# 有効期間を指定します。 単位は秒です。 
$expire_time = 30
$server_ip = "0.0.0.0"
$server_port = 8000

ARGV.length === 1の場合 
  $server_port = ARGV[0]
elsif ARGV.length == 2
  $server_ip = ARGV[0]
  $server_port = ARGV[1]
終了

puts "App server is running on: http:// #{$ server_ip }:#{$ server_port}"

def hash_to_jason(source_hash)
  jason_string = source_hash.to_json;    

  jason_string.gsub!("\": [", "\": ["))
  jason_string.gsub!("\", \"", "\", \"")
  jason_string.gsub!("], \" ", "], \"")
  jason_string.gsub!("\": \"", "\": \"")

  jason_string
終了


def get_token()
  expire_syncpoint = Time.now.to_i + $expire_time
  expire = Time.at(expire_syncpoint).utc.iso8601()
  response.headers['expire'] = expire
  policy_dict = {}
  condition_arrary = Array.new
  array_item = Array.new
  array_item.push('starts-with')
  array_item.push('$key')
  array_item.push($upload_dir)
  condition_arrary.push(array_item)
  policy_dict["conditions"] = condition_arrary
  policy_dict["expiration"] = expire
  policy = hash_to_jason(policy_dict)
  policy_encode = Base64.strict_encode64 (ポリシー).chomp;
  h = OpenSSL::HMAC.digest('sha1', $access_key_secret, policy_encode)
  hs=ダイジェスト::MD5.hexdigest(h)
  sign_result = Base64.strict_encode64(h).strip()
  token_dict = {}
  token_dict['ossAccessKeyId'] = $access_key_id
  token_dict['host'] = $host
  token_dict['policy'] = policy_encode
  token_dict['signature'] = sign_result 
  token_dict['expire'] = expire_syncpoint
  token_dict['dir'] = $upload_dir
  result = hash_to_jason(token_dict)
  結果
終了

set :bind, $server_ip
set :port, $server_port

get '/get_post_signature_for_oss_upload' do
  token = get_token()
  「トークン: #{Token} 」を置く
  トークン
終了

'/*' を取得する
  「 ********************* GET」を置く
  ファイル. join(settings.public_folder, 'index.html ')
終了

終了

ARGV.length === 1の場合 
  $server_port = ARGV[0]
elsif ARGV.length == 2
  $server_ip = ARGV[0]
  $server_port = ARGV[1]
終了

$server_ip = "0.0.0.0"
$server_port = 8000

puts "App server is running on: http:// #{$ server_ip }:#{$ server_port}"

set :bind, $server_ip
set :port, $server_port

get '/get_sts_token_for_oss_upload' do
  token = get_sts_token_for_oss_upload()
  response = {
    "AccessKeyId" => トークン ["資格情報"]["AccessKeyId"] 、
    "AccessKeySecret" => トークン ["資格情報"]["AccessKeySecret"] 、
    "SecurityToken" => token["Credentials"]["SecurityToken"]
  }
  レスポンス. to_json
終了

'/*' を取得する
  「 ********************* GET」を置く
  ファイル. join(settings.public_folder, 'index.html ')
終了

C#

Microsoft.AspNetCore.Builderを使用した

;
Microsoft.Extensions.DependencyInjectionを使用します。Microsoft.AspNetCore.Http; を使用
System.IOを使用する。System.Collections.Generic; の使用
システムを使用して;
システムの使用グローバリゼーション;
System.Textを使用する。System.Security.Cryptographyを使用する。Newtonsoft.Jsonを使用する。Microsoft.AspNetCore.Http.Extensionsの使用
Microsoft.AspNetCore.Mvc; を使用
Microsoft.Extensions.Logging; を使用して

名前空間YourNamespace
{
    公共クラスプログラム
    {
        プライベートILogger<Program> _logger;
        // ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
        パブリック文字列AccessKeyId { get; set; } = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID");
        // ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKeyシークレットを取得します。 
        パブリック文字列AccessKeySecret { get; set; } = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // hostパラメーターを指定します。 形式: BucketName.Endpoint. <YOUR-BUCKET> をバケットの名前に置き換えます。 <YOUR-ENDPOINT> をs oss-cn-hangzhou.aliyuncs.comなど、バケットが配置されているリージョンのエンドポイントに置き換えます。 
        パブリック文字列ホスト {get; set; } = "<あなたのバケット>.<YOUR-ENDPOINT>";
        // OSSにアップロードするオブジェクトの名前にプレフィックスを指定します。 
        パブリック文字列UploadDir { get; set; } = "user-dir-prefix/";
        // 有効期間を指定します。 単位は秒です。 
        public int ExpireTime { get; set; } = 3600;
        パブリッククラスPolicyConfig
        {
            パブリック文字列の有効期限 {get; set; }
            パブリックリスト <リスト <オブジェクト>> 条件 {get; set; }
        }
        パブリッククラスPolicyToken
        {
            public string Accessid { get; set; }
            パブリック文字列ポリシー {get; set; }
            public string Signature { get; set; }
            パブリック文字列Dir { get; set; }
            public string Host { get; set; }
            パブリック文字列Expire { get; set; }
        }
        public static voidメイン (string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            builder.Logging.AddConsole();
            var logger = builder.Services.BuildServiceProvider().GetRequiredService<ILogger<Program>>();

            app.UseStaticFiles(); 

            app.MapGet("/", async (context) =>
            {
                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "templates/index.html");
                var htmlContent = await File.ReadAllTextAsync(filePath);
                コンテキストを待ちます。Response.WriteAsync(htmlContent);
                logger.LogInformation("GET request to root path");
            });

            app.MapGet("/get_post_signature_for_oss_upload", async (context) =>
            {
                var program=新しいプログラム (ロガー);
                var token = program.GetPolicyToken();

                logger.LogInformation($"Token: {token}");

                context.Response.ContentType = "application/json";
                コンテキストを待ちます。Response.WriteAsync (トークン);
            });

            app.Run();
        }

        public Program(ILogger<Program> logger)
        {
            _logger = logger;
        }

        プライベート文字列ToUnixTime(DateTime dateTime)
        {
            return ((DateTimeOffset)dateTime).ToUnixTimeSeconds().ToString();
        }

        プライベート文字列GetPolicyToken()
        {
            var expireDateTime = DateTime.Now.AddSeconds(ExpireTime);
            var config = new PolicyConfig
            {
                expiration = FormatIso8601Date(expireDateTime) 、
                conditions = new List<List<object>>()
            };
            config.conditions.Add(new List<object>)
            {
                "content-length-range", 0, 1048576000
            });
            var policy = JsonConvert.SerializeObject(config);
            var policyBase64 = EncodeBase64("utf-8" 、ポリシー);
            var signature = ComputeSignature(AccessKeySecret、policyBase64);
            var policyToken=新しいPolicyToken
            {
                Accessid = AccessKeyId、
                ホスト=ホスト、
                ポリシー=policyBase64、
                署名=署名、
                Expire = ToUnixTime(expireDateTime) 、
                Dir = UploadDir
            };
            を返すJsonConvert.SerializeObject(policyToken);
        }

        プライベート文字列FormatIso8601Date(DateTime dtime)
        {
            return dtime.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'" 、
                                    CultureInfo。CurrentCulture);
        }

        プライベート文字列EncodeBase64(string codeType, string code)
        {
            string encode = "";
            byte[] bytes = Encoding.GetEncoding(codeType).GetBytes(code);
            try
            {
                encode = Convert.ToBase64String (バイト);
            }
            キャッチ
            {
                encode=コード;
            }
            encodeを返します。
        }

        プライベート文字列ComputeSignature (文字列キー、文字列データ)
        {
            using (var algorithm = new HMACSHA1(Encoding.UTF8.GetBytes(key)))
            {
                return Convert.ToBase64String(algorithm.ComputeHash(Encoding.UTF8.GetBytes(data)));
            }
        }
    }
}

クライアント側のサンプルコード

次のサンプルコードは、署名とPOSTポリシーを使用して、webクライアントからOSSにオブジェクトをアップロードする方法の例を示しています。

const form = document.querySelector("form");
const fileInput = document.querySelector("#file");
form.addEventListener("submit", (event) => {
  event.preventDefault();
  const file = fileInput.files[0];
  const filename = fileInput.files[0].name;
  fetch("/get_post_signature_for_oss_upload", { method: "GET" })
    . then((応答) => {
      if (!response.ok) {
        新しいエラーを投げる ("署名の取得に失敗しました") 。
      }
      return response.json();
    })
    . then((データ) => {
      const formData=新しいFormData();
      formData.append("name", filename);
      formData.append("policy", data.policy);
      formData.append("OSSAccessKeyId", data.ossAccessKeyId);
      formData.append("success_action_status" 、"200");
      formData.append("signature", data.signature);
      formData.append("key", data.dir + filename);
      formData.append("file", file);

      return fetch(data.host, { method: "POST", body: formData });
    })
    . then((応答) => {
      if (response.ok) {
        console.log("アップロード");
        alert (「オブジェクトアップロード」);
      } else {
        console.log (「アップロード失敗」、応答);
        alert("オブジェクトのアップロードに失敗しました。 オブジェクトを再アップロードしてみてください ";
      }
    })
    . catch((エラー) => {
      console.error("エラーが発生しました:" 、エラー);
    });
});

アプリケーションサーバーからPutObject操作の署名付きURLを取得する

重要

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

処理中

image

以下の例は、コアコードブロックのみを提供する。 完全なサンプルコードについては、presignedurl.zipパッケージをダウンロードしてください。

サーバー側のサンプルコード

次のサンプルコードは、アプリケーションサーバーから署名付きURLを取得する方法の例を示しています。

Java

com.aliyun.oss.OSSをインポートします。com.aliyun.oss.OSSClientBuilderをインポートします。org.springframework.beans.factory.annotation.Valueをインポートします。org.springframework.context.annotation.Configurationをインポートします。org.springframework.context.annotation.Beanをインポートします。com.aliyun.oss.HttpMethodをインポートします。com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。org.springframework.beans.factory.annotation.Autowired;
org.springframework.stereotype.Controllerをインポートします。org.springframework.web.bind.annotation.GetMappingをインポートします。org.springframework.web.bind.annotation.ResponseBodyをインポートします。impor t java.net.URL;
java.util.Dateをインポートします。javax.annotation.PreDestroyをインポートします。@ 設定
public class OssConfig {

    /**
     * バケットが配置されているリージョンのエンドポイントを指定します。 例: oss-cn-hangzhou.aliyuncs.com。 
     */
    private static final String endpoint = " https://oss-cn-hangzhou.aliyuncs.com ";

    /**
     * ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。
     */
    @ Value("${ALIBABA_CLOUD_ACCESS_KEY_ID}")
    プライベート文字列accessKeyId;

    /**
     * ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKeyシークレットを取得します。
     */
    @ Value("${ALIBABA_CLOUD_ACCESS_KEY_SECRET}")
    プライベート文字列accessKeySecret;

    プライベートOSS ossClient;


    @Bean
    パブリックOSS getSssClient() {
        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClientを返します。
    }

    @ PreDestroy
    public void onDestroy() {
        ossClient.shutdown();
    }
}

@ コントローラー
public class PresignedURLController {

    /**
     * <your-bucket> をバケットの名前に置き換えます。 
     * OSSにアップロードするオブジェクトの名前にプレフィックスを指定します。 
     * <your-object> をオブジェクトのフルパスに置き換えます。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。 
     * 有効期間を指定します。 単位:ミリ秒。 
     */
    プライベートstatic final String BUCKET_NAME = "<your-bucket>";
    プライベート静的最終文字列OBJECT_NAME = "<your-object>";
    プライベートスタティックファイナルロングEXPIRE_TIME = 3600 * 1000L;

    @Autowired
    プライベートOSS ossClient;

    @ GetMapping("/get_presigned_url_for_oss_upload")
    @ResponseBody
    public String generatePresignedURL() {

        try {
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(BUCKET_NAME, OBJECT_NAME, HttpMethod.PUT);
            日付の有効期限=新しい日付 (System.currentTimeMillis() + EXPIRE_TIME);
            request.setExpiration(expiration);
            request.setContentType("image/png");
            URL signedUrl = ossClient.generatePresignedUrl(request);
            signedUrl.toString() を返します。
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

Node.js

const express = require("express");
const { Buffer } = require("buffer");
const OSS = require("ali-oss");
const app = express();
const path = require("path");
const fs = require("fs");
const axios = require("axios");

const config = {
  // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 
  region: '<YOURREGION>' 、
  // ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
  accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID、
  // ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKeyシークレットを取得します。 
  accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET、
  // <YOUR-BUCKET> をバケットの名前に置き換えます。 
  bucket: "<YOUR-BUCKET>" 、}
const object = "examplefile.png";

app.us e(express.static(path.join(__dirname, "templates")));

app.get("/get_presigned_url_for_oss_upload", async (req, res) => {
    const client = new OSS(config);
    const url = client.signatureUrl(object, {
        メソッド: "PUT" 、
        "Content-Type": "application/x-www-form-urlencoded" 、
    });
    res.send(url); 
    console.log(url);
  });

app.listen(8000, () => {
  console.log("http:// 127.0.0.1:8000");
});

Python

oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート

# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# <YOUR_ENDPOINT> を、バケットが配置されているリージョンのエンドポイントに置き換えます。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 
# <YOUR_BUCKET> をバケットの名前に置き換えます。 
bucket = oss2.Bucket(auth, '<YOUR_ENDPOINT>', '<YOUR_BUCKET>')
# 有効期間を指定します。 単位は秒です。 
expire_time = 3600
# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.png バケット名をフルパスに含めないでください。 
object_name = 'exampledir/exampleobject.png'

def generate_presigned_url():
    # ヘッダーを指定します。 
    headers = dict()
    # Content-Typeヘッダーを指定します。 
    ヘッダー ['Content-Type'] = 'image/png'
    # オブジェクトのストレージクラスを指定します。 
    # headers["x-oss-storage-class"] = "Standard"
    # デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。 
    # slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 この場合、生成された署名付きURLを使用してオブジェクトをアップロードできます。 
    url = bucket.sign_url('PUT', object_name, expire_time, slash_safe=True, headers=headers)
    リターンurl

Go

パッケージメイン

import (import (import)
"fmt"
"net/http"
"os"

「github.com/aliyun/aliyun-oss-go-sdk/oss」
)

func getURL() string {
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 実際のエンドポイントを指定します。 
	endpoint := " https://oss-cn-beijing.aliyuncs.com "
// バケットの名前を指定します。 例: examplebucket. 
	bucketName := "examplebucket"
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
	objectName := "exampledir/exampleobject.txt"
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_IDとALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
	accessKeyID := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
accessKeySecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")

client, err := oss.New(endpoint, accessKeyID, accessKeySecret)
if err! =nil {
fmt.Println("json err:", err)
}
bucket, err := client.Bucket(bucketName)
if err! =nil {
fmt.Println("json err:", err)
}
options := []oss. オプション {
oss.ContentType("image/png") 、}
signedURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60, options...)
if err! =nil {
fmt.Println("json err:", err)
}

signedURLを返す
}

func handler(w http.ResponseWriter, r * http.Request) {
if r.URL.Path == "/" {
http.ServeFile(w、r、"templates/index.html")
リターン
} else if r.URL.Path == "/get_presigned_url_for_oss_upload" {
url := getURL()
fmt.Fprintf(w, "% s", url)
リターン
}
http.NotFound(w, r)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}

PHP

<?php
require_once __DIR__。 '/vendor/autoload.php';
OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。OSS\Http\RequestCoreを使用します。OSS\Http\ResponseCoreを使用します。// サンプルコードを実行する前に、環境変数と環境変数が設定されていることを確認してください。 
$accessKeyId = getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
$accessKeySecret = getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 
^ " $single YOUR-ENDPOINT > >."
// バケットの名前を指定します。 
$bucket= "<YOUR-BUCKET>";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 
$object = "test.png";
// 署名付きURLの有効期間を3,600秒に設定します。 
$timeout = 3600;
try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
    // Generate the signed URL. 
    $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", array('Content-Type' => 'image/png'));
    // 返されたデータを表示します。
    echo $signedUrl;
} catch (OssException $e) {
    printf($e->getMessage()) 。 "\n");
    戻ります。}

Ruby

は「シナトラ」を必要とする
'base64' が必要
「open-uri」が必要です
「cgi」が必要
'openssl' が必要
'json' が必要
「sinatra/reloader」が必要です
'sinatra/content_for 'が必要です
'aliyun/oss' が必要です
include Aliyun::OSS

# パブリックフォルダーのパスを、現在のフォルダー内のテンプレートサブフォルダーに設定します。
set :public_folder, File.dirname(__FILE__) + '/templates'

# ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
$access_key_id = ENV['ALIBABA_CLOUD_ACCESS_KEY_ID ']
# ALIBABA_CLOUD_ACCESS_SECRET環境変数からAccessKey secretを取得します。 
$access_key_secret = ENV['ALIBABA_CLOUD_ACCESS_KEY_SECRET ']

# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.png バケット名をフルパスに含めないでください。 
object_key = 'exampledir/exampleobject.png'

def get_presigned_url (クライアント, object_key)
  # <YOUR-BUCKET> をバケットの名前に置き換えます。 
  bucket = client.get_bucket('<YOUR-BUCKET>')
  # 署名付きURLを生成し、URLの有効期間を3600に設定します。 単位は秒です。 
  bucket.object_url(object_key, 3600)
終了

client = Aliyun::OSS::Client.new (
  # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 
  endpoint: '<YOUR-ENDPOINT>' 、
  # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
  access_key_id: $access_key_id、
  access_key_secret: $access_key_secret
)


ARGV.length === 1の場合 
  $server_port = ARGV[0]
elsif ARGV.length == 2
  $server_ip = ARGV[0]
  $server_port = ARGV[1]
終了

$server_ip = "0.0.0.0"
$server_port = 8000

puts "App server is running on: http:// #{$ server_ip }:#{$ server_port}"

set :bind, $server_ip
set :port, $server_port

'/get_presigned_url_for_oss_upload' を取得する
  url = get_presigned_url (クライアント、object_key.to_s)
  「トークン: #{url} 」を置く
  url
終了

'/*' を取得する
  「 ********************* GET」を置く
  ファイル. join(settings.public_folder, 'index.html ')
終了

C#

Microsoft.AspNetCore.Builderを使用した

;
Microsoft.Extensions.DependencyInjectionを使用します。Microsoft.AspNetCore.Http; を使用
System.IOを使用する。システムを使用して;
Microsoft.Extensions.Logging; を使用して
Aliyun.OSSを使用します。名前空間YourNamespace
{
    公共クラスプログラム
    {
        プライベートILogger<Program> _logger;

        // ALIBABA_CLOUD_ACCESS_KEY_ID環境変数からAccessKey IDを取得します。 
        パブリック文字列AccessKeyId { get; set; } = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID");
        // ALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数からAccessKeyシークレットを取得します。 
        パブリック文字列AccessKeySecret { get; set; } = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // <YOUR-ENDPOINT> をバケットが配置されているリージョンのエンドポイントに置き換えます。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 
        プライベート文字列EndPoint { get; set; } = "<YOUR-ENDPOINT>";
        // <YOUR-BUCKET> をバケットの名前に置き換えます。 
        プライベート文字列BucketName { get; set; } = "<YOUR-BUCKET>";
        プライベート文字列ObjectName { get; set; } = "exampledir/exampleobject2.png";

        public static voidメイン (string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            // ロギングを指定します。
            builder.Logging.AddConsole();
            var logger = builder.Services.BuildServiceProvider().GetRequiredService<ILogger<Program>>();

            app.UseStaticFiles(); // 静的ファイルミドルウェアを有効にするには、この行を追加します。

            app.MapGet("/", async (context) =>
            {
                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "templates/index.html");
                var htmlContent = await File.ReadAllTextAsync(filePath);
                コンテキストを待ちます。Response.WriteAsync(htmlContent);

                // ログを表示します。
                logger.LogInformation("GET request to root path");
            });

            app.MapGet("/get_presigned_url_for_oss_upload", async (context) =>
            {
                var program=新しいプログラム (ロガー);
                var signedUrl = program.GetSignedUrl();

                logger.LogInformation($"SignedUrl: {signedUrl}"); // トークンの値を表示します。
                コンテキストを待ちます。Response.WriteAsync(signedUrl);
            });

            app.Run();
        }

        // 関数を作成してILoggerに挿入します。
        public Program(ILogger<Program> logger)
        {
            _logger = logger;
        }

        プライベート文字列GetSignedUrl()
        {
            // Create an OSSClient instance.
            var ossClient = new OssClient(EndPoint、AccessKeyId、AccessKeySecret);

            // 署名付きURLを生成するリクエストを作成します。
            var generatePresignedUriRequest = new GeneratePresignedUriRequest(BucketName, ObjectName, SignHttpMethod.Put)
            {
                Expiration = DateTime.Now.AddHours(1),
                ContentType = "image/png"
            };
            var signedUrl = ossClient.GeneratePresignedUri(generatePresignedUriRequest);

            signedUrl.ToString() を返します。
        }
    }
}

クライアント側のサンプルコード

次のサンプルコードは、署名付きURLを使用してwebクライアントからOSSにオブジェクトをアップロードする方法の例を示しています。

const form = document.querySelector("form");
form.addEventListener("submit", (event) => {
  event.preventDefault();
  const fileInput = document.querySelector("#file");
  const file = fileInput.files[0];
  fetch("/get_presigned_url_for_oss_upload", { method: "GET" })
    . then((応答) => {
      if (!response.ok) {
        新しいエラーを投げる ("署名されたURLの取得に失敗しました") 。
      }
      return response.text();
    })
    . then((url) => {
      const formData=新しいFormData();
      formData.append("file", file);
      fetch(url, {
        メソッド: "PUT" 、
        headers: 新しいヘッダー ({
          "Content-Type": "image/png" 、
        }),
        body: ファイル、
      }).then(((レスポンス) => {
        if (!response.ok) {
          新しいエラー (「オブジェクトをOSSにアップロードできませんでした」) をスローします。
        }
        console.log (応答);
        alert (「オブジェクトアップロード」);
      });
    })
    . catch((エラー) => {
      console.error("エラーが発生しました:" 、エラー);
      警告 (error.message);
    });
});

関連ドキュメント

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

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