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

Object Storage Service:Goでサーバー側署名、直接アップロード、アップロードコールバックを実装する

最終更新日:Dec 18, 2024

このトピックでは、サーバー側で署名を実装し、アップロードコールバックを設定し、Go言語を使用してHTMLフォームからObject Storage Service (OSS) への直接アップロードを有効にする方法について説明します。

前提条件

  • アプリケーションサーバーのドメイン名は、インターネット経由でアクセスできます。

  • アプリケーションサーバーにGo 1.6以降がインストールされています。 Goバージョンを確認するには、go versionコマンドを実行します。

  • PCのブラウザはJavaScriptをサポートしています。

手順1: アプリケーションサーバーの設定

  1. ソースコードを目的のディレクトリに配置します。 この例では、ソースコードはUbuntu 16.04の /home/aliyun/aliyun-oss-appserver-goディレクトリに配置されます。

  2. ディレクトリに移動します。 appserver.goファイルを開きます。 次のスニペットを変更します。

    // Enter your AccessKey ID. 
    var accessKeyId string = "<yourAccessKeyId>"
    
    // Enter your AccessKey secret. 
    var accessKeySecret string = "<yourAccessKeySecret>"
    
    // Set host to a value that is in the format of bucketname.endpoint. 
    var host string = "https://bucket-name.oss-cn-hangzhou.aliyuncs.com'"
    
    // Specify the URL of the application server to which an upload callback request is sent. Replace the IP address and port number with your actual information. 
    var callbackUrl string = "http://192.0.2.0:8888";
    
    // Specify the prefix for the name of the object you want to upload. 
    var upload_dir string = "user-dir-prefix/"
    
    // Specify the validity period in seconds for the upload policy. 
    var expire_time int64 = 30
    • accessKeyId: AccessKey IDを入力します。

    • accessKeySecret: AccessKeyシークレットを入力します。

    • host: 形式はhttps:// bucketname.endpointです。 例: https://bucket-name.oss-cn-hangzhou.aliyuncs.com 。 エンドポイントの詳細については、「エンドポイント」をご参照ください。

    • callbackUrl: アップロードコールバック要求の送信先であるアプリケーションサーバーのコールバックURLを指定します。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトをアップロードした後、OSSはURLを使用してアップロード情報をアプリケーションサーバーに送信します。 この例では、"http:// 192.0.2.0:1234" がコールバックURLです。

    • dir: オブジェクトの名前のプレフィックスを指定します。 このパラメータは空のままにすることもできます。

ステップ2: クライアントの設定

  1. クライアントソースコードをPCのローカルディレクトリにダウンロードします。

  2. パッケージを解凍します。 upload.jsファイルを開きます。 ファイルから次の行を検索します。

    // serverUrl specifies the URL of the application server that returns information about the signature and upload policy. Replace the sample IP address and port number with your actual IP address and port number. 
    serverUrl ='http://192.0.2.0:8888'
  3. serverUrlをアプリケーションサーバーのURLに設定します。 この例では、serverUrlは 'http:// 192.0.2.0:1234 'に設定されています。

ステップ3: CORS設定の変更

フォームアップロードを使用してクライアントからOSSにデータをアップロードすると、Originヘッダーを含むリクエストがブラウザーからOSSに送信されます。 OSSは、Originヘッダーを含むリクエストがバケットのクロスオリジンリソース共有 (CORS) ルールと一致するかどうかをチェックします。 異なるオリジンからバケットへのPOSTベースのアップロードを許可するには、適切なCORSルールを設定する必要があります。

  1. OSSコンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションツリーで、[コンテンツセキュリティ] > [CORS] を選択します。

  4. CORSページで、[ルールの作成] をクリックし、次の図に示すように、[ルールの作成] パネルでパラメーターを設定します。

    説明

    データのセキュリティを確保するために、OSSがソースでリクエストを許可するドメイン名を正確に指定することを推奨します。 CORS設定の詳細については、「CORSの設定」をご参照ください。

ステップ4: ファイルをアップロードする

  1. アプリケーションサーバを起動します。

    /home/aliyun/aliyun-oss-appserver-goディレクトリで、go run appserver.go 192.0.2.0 1234コマンドを実行して、アプリケーションサーバーを起動します。

    説明

    IPアドレスとポート番号を、アプリケーションサーバーのIPアドレスとポート番号に置き換えます。

  2. クライアントを起動します。

    1. クライアントソースコードが保存されているローカルディレクトリに移動し、index.htmlブラウザのファイル

      重要

      index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用しているときに問題が発生した場合は、デバッグを実行します。

    2. [ファイルの選択] をクリックし、サポートされているタイプのファイルを選択します。 [アップロード] をクリックします。 オブジェクトをアップロードすると、アプリケーションサーバーから返されたコンテンツが表示されます。

アプリケーションサーバのコアコード

アプリケーションサーバーのソースコードは、署名ベースの直接アップロードおよびアップロードコールバックを実装します。

  • 署名ベースの直接アップロード

    アプリケーションサーバは、クライアントから送信されたGET要求に応答する。 サンプルコード:

    func handlerRequest(w http.ResponseWriter, r *http.Request) {   
            if (r.Method == "GET") {
                    response := get_policy_token()
                    w.Header().Set("Access-Control-Allow-Methods", "POST")
                    w.Header().Set("Access-Control-Allow-Origin", "*")
                    io.WriteString(w, response)
            }
  • コールバックのアップロード

    アプリケーションサーバーは、OSSから送信されたPOSTメッセージに応答します。 サンプルコード

    if (r.Method == "POST") {
                    fmt.Println("\nHandle Post Request ... ")
    
                    // Get PublicKey bytes
                    bytePublicKey, err := getPublicKey(r)
                    if (err != nil) {
                            responseFailed(w)
                            return
                    }
    
                    // Get Authorization bytes : decode from Base64String
                    byteAuthorization, err := getAuthorization(r)
                    if (err != nil) {
                            responseFailed(w)
                            return
                    }
    
                    // Get MD5 bytes from Newly Constructed Authorization String. 
                    byteMD5, err := getMD5FromNewAuthString(r)
                    if (err != nil) {
                            responseFailed(w)
                            return
                    }
    
                    // verifySignature and response to client 
                    if (verifySignature(bytePublicKey, byteMD5, byteAuthorization)) {
                            // do something you want according to callback_body ...
    
                            responseSuccess(w)  // response OK : 200  
                    } else {
                            responseFailed(w)   // response FAILED : 400 
                    }
            }

    詳細については、「コールバック」をご参照ください。