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

Object Storage Service:Ruby

最終更新日:Dec 20, 2023

このトピックでは、サーバー上のRubyで署名を計算し、アップロードコールバックを設定し、フォームアップロードを使用してデータをOSSにアップロードする方法について説明します。

前提条件

  • アプリケーションサーバのドメイン名は、インターネットを介してアクセス可能である。
  • アプリケーションサーバーにRuby 2.0以降がインストールされています。 Rubyのバージョンを表示するには、ruby -vコマンドを実行します。
  • PCのブラウザはJavaScriptをサポートしています。

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

  1. Rubyにあるアプリケーションサーバーのソースコードをダウンロードします。
  2. Ubuntu 16.04がこの例で使用されています。 ソースコードを /home/aliyun/aliyun-oss-appserver-rubyディレクトリに解凍します。
  3. ディレクトリに移動します。 ソースコードを含むappserver.rbファイルを開きます。 次のスニペットを変更します。
    # AccessKey IDを入力します。 
    $access_key_id = '<yourAccessKeyId>'
    
    # AccessKeyシークレットを入力します。 
    $access_key_secret = '<yourAccessKeySecret>'
    
    # $hostをbucketname.endpointの形式の値に設定します。 
    $host = 'https:// bucket-name.oss-cn-hangzhou.aliyuncs.com ';
    
    # アップロードコールバック要求の送信先のアプリケーションサーバーのURLを指定します。 IPアドレスとポート番号を実際の情報に置き換えます。 
    $callback_url = "http:// 192.0.2.0:8888";
    
    # アップロードするオブジェクトの名前のプレフィックスを指定します。 
    $upload_dir = 'user-dir-prefix/' 
    • $access_key_id: AccessKey IDを入力します。
    • $access_key_secret: AccessKeyシークレットを入力します。
    • $host: 形式はhttps:// bucketname.endpointです。 例: https://bucket-name.oss-cn-hangzhou.aliyuncs.com。 エンドポイントの詳細については、「Terms」トピックの「エンドポイント」セクションを参照してください。
    • $callback_url: アップロードコールバック要求の送信先のアプリケーションサーバーのURLを指定します。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトをアップロードした後、OSSはURLを使用してオブジェクトアップロードに関する情報をアプリケーションサーバーに送信します。 この例では、$callback_url="http:// 192.0.2.0:1234"; を指定します。
    • $upload_dir: オブジェクトの名前のプレフィックスを指定します。 このパラメーターを指定しないままにすることもできます。

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

  1. クライアントソースコードパッケージをダウンロードします。
  2. パッケージをディレクトリに解凍します。 この例では、D:\aliyun\aliyun-oss-appserver-jsディレクトリが使用されています。
  3. ディレクトリに移動し、upload.jsファイルを開き、次のコードを見つけます。
    // serverUrlは、署名情報とアップロードポリシーを返すアプリケーションサーバーのURLを指定します。 ビジネスシナリオでは、サンプルのIPアドレスとポート番号を実際の値に置き換えます。 
    serverUrl = 'http:// 192.0.2.0:8888 ' 
  4. 署名やアップロードポリシーなどの情報をクライアントに返すアプリケーションサーバーのURLにseverUrlを設定します。 この例では、serverUrl = 'http:// 192.0.2.0:1234 'を指定します。

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

フォームアップロードを使用してクライアントからOSSにデータをアップロードする場合、クライアントはリクエストにOriginヘッダーを含め、ブラウザーを使用してリクエストをOSSに送信します。 OSSは、クロスオリジンリソース共有 (CORS) 検証用のOriginヘッダーを含むリクエストメッセージを検証します。 POSTメソッドを使用するには、バケットのCORSルールを設定します。

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

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

  3. 左側のナビゲーションツリーで、[コンテンツセキュリティ] > [クロスオリジンリソース共有 (CORS)] を選択します。
  4. [ルールの作成] をクリックし、パラメーターを設定します。 次の図にパラメーターを示します。
    説明 データのセキュリティを確保するために、OSSでリクエストを許可する実際のドメイン名をソースで指定することを推奨します。 CORS設定の詳細については、「CORSの設定」をご参照ください。

ステップ4: アップロードコールバック要求を送信する

  1. アプリケーションサーバーを起動します。
    /home/aliyun/aliyun-oss-appserver-rubyディレクトリで、ruby appserver.rb 192.0.2.0 1234コマンドを実行して、アプリケーションサーバーを起動します。
    説明 IPアドレスとポート番号を、設定したアプリケーションサーバーのIPアドレスとポート番号に置き換えます。
  2. クライアントを起動します。
    PCで、クライアントソースコードを含むディレクトリにあるindex.htmlファイルを開きます。
    重要 index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用するときに問題が発生した場合は、デバッグを実行する必要があります。
  3. オブジェクトをアップロードします。
    [ファイルの選択] をクリックします。 指定したタイプのファイルを選択します。 [アップロード] をクリックします。 オブジェクトがアップロードされると、コールバックサーバーによって返されたコンテンツが表示されます。

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

アプリケーションサーバーのソースコードは、署名ベースのアップロードとアップロードコールバックを実装するために使用されます。

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

    署名ベースのアップロード中、アプリケーションサーバーはクライアントから送信されたGETメッセージに応答します。 スニペットの例:

    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()
    
        callback_dict = {}
        callback_dict['callbackBodyType'] = 'application/x-www-form-urlencod';
        callback_dict['callbackBody'] = 'filename =${ object}&size =${ size}&mimeType =${ mimeType}&height =${ imageInfo.height}&width =${ imageInfo.width}';
        callback_dict['callbackUrl'] = $callback_url;
        callback_param = hash_to_jason(callback_dict)
        base64_callback_body = Base64.strict_encode64(callback_param);
    
        token_dict = {}
        token_dict['accessid'] = $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
        token_dict['callback'] = base64_callback_body
        response.headers["アクセス制御-許可-メソッド"] = "POST"
        response.headers["Access-Control-Allow-Origin"] = "*"
        result = hash_to_jason(token_dict)
    
        結果
    終了
    
    '/*' を取得する
      「 ********************* GET」を置く
      get_token()
    終了 
  • アップロードコールバック

    アップロードコールバック中に、アプリケーションサーバーはOSSから送信されたPOSTメッセージに応答します。 スニペットの例:

    post '/*' do
      「 ********************* POST」を置く
      pub_key_url = Base64.decode64(get_header('x-oss-pub-key-url'))
      pub_key = get_public_key(pub_key_url)
      rsa = OpenSSL::PKey::RSA.new(pub_key)
    
      authorization = Base64.decode64(get_header('authorization'))
      req_body = request.body.read
      if request.query_string.empty? then
        auth_str = CGI.unescape(request.path) + "\n" + req_body
      else
        auth_str = CGI.unescape(request.path) + '?' + request.query_string + "\n" + req_body
      end
    
      valid = rsa.public_key.verify ()
        OpenSSL:: ダイジェスト::MD5.new, authorization, auth_str)
    
      有効な場合
        # body({'Status' => 'OK'}.to_json)
        body(hash_to_jason({'Status' => 'OK'}))
      else
        停止400、「許可に失敗しました! 」
      終了
    終了 

    詳細については、「コールバック」トピックの「 (オプション) 手順4: コールバック要求に署名する」セクションを参照してください。