背景

モバイルアプリ向けの直接データ転送の設定」では、30 分でモバイルアプリの OSS ベースの直接データ転送を設定する方法について説明しています。 次のフローチャートは、モバイルアプリの開発について説明しています。

ロール:

  • アプリサーバーは、Android / iOSモバイルアプリの STS 認証情報を生成します。

  • Android / iOSモバイルアプリは、アプリサーバーからの STS 認証情報を申請し、その STS 認証情報を使用します。

  • OSS は、Android / iOS モバイルアプリからの要求を処理します。

前のフローチャートのステップ1 (STS 資格情報の申請) を実行した後、Android / iOS モバイルアプリは、ステップ 5 (STS 資格情報を使用してデータを OSS にアップロードする) を繰り返し実行します。 この場合、アプリサーバーはアプリがどのデータをアップロードしているのか認識できないため、アプリ開発者はアップロードされたデータを管理することができません。 Android / iOS モバイルアプリによってアップロードされたデータをアプリサーバーに認識させる方法については、OSS データコールバックサービスを使用することで対処することができます。

次のフローチャートをご覧ください。

OSS は、Android / iOS モバイルアプリからデータを受信した後 (前のフローチャートのステップ 5)かつ、アップロード結果をアプリに返す前 (ステップ6) に、コールバックをトリガーします。 コールバックはステップ 5.5 としてマークされます。 OSS はアプリサーバーからデータをコールバックし、アプリサーバーから返されたコンテンツを取得します。 その後、OSS はそのコンテンツを Android / iOS モバイルアプリに返します。 詳しくは、「Callback API Documentation」をご参照ください。

データコールバック関数

  • アプリサーバーにアップロードされたデータに関する基本情報の取得

    次のテーブルに基本情報を示します。 次のテーブルの 1 つ以上の変数が返されます。返されるコンテンツの形式は、Android / iOS モバイルアプリがデータをアップロードするときに指定されます。

    システム変数 意味
    bucket モバイルアプリがデータをアップロードするストレージスペース (バケット)
    object モバイルアプリケーションによってアップロードされたデータで、 OSS に保存されたファイル名
    etag アップロードされたファイルのタグ。 モバイルアプリに対して返される etag フィールド
    size アップロードされたファイルのサイズ
    mimeType リソースタイプ
    imageInfo.height イメージの高さ
    imageInfo.width イメージの幅
    imageInfo.format イメージ形式 (JPG や PNG など) (認識されたイメージのみ)
  • カスタム変数を介した情報の転送

    データをアップロードしているユーザーのアプリのバージョン、OS のバージョン、場所、および携帯電話モデルを知りたい場合は、ファイルのアップロード中に Android / iOS モバイルアプリクライアントを指定し、上記の変数を送信します。 例

    • x: version はアプリのバージョンを示します。

    • x: system は OS のバージョンを表します。

    • x: gps は保存先を示します。

    • x: phone は携帯電話のモデルを示します。

      これらの値は、Android / iOS モバイルアプリがデータを OSS にアップロードするときに添付されます。 その後、OSS は CallbackBody に値を含めてアプリサーバーに送信します。 このようにして、情報がアプリサーバーに転送されます。

モバイルアプリクライアントのデータコールバック設定

アップロード要求を受信したときに OSS がコールバックをトリガーできるようにするには、モバイルアプリで次の 2 つの項目を要求に含める必要があります。

  • callbackUrl は、データがコールバックされるアプリケーションサーバーを示します。例: http://abc.com/callback.php. サーバーアドレスはインターネット経由でアクセスできる必要があることに注意してください。
  • callbackBody は、コールバックされてアプリケーションサーバーに送信されるコンテンツを示します。 コンテンツには、OSS がアプリケーションサーバーに返す 変数が1 つ以上含まれます。

たとえば、データがコールバックされて http://abc.com/callback.php のアプリケーションサーバーに送信されたとします。 携帯電話によってアップロードされたファイルの名前とサイズを取得しようとしているとします。 定義された変数 "photo" は携帯電話のモデルを取得し、変数 "system" は OS のバージョンを取得します。

アップロードコールバックの 2 つのサンプルは次のとおりです。

  • iOS アプリのデータコールバックサンプルコード:
    OSSPutObjectRequest * request = [OSSPutObjectRequest new];
    request.bucketName = @"<bucketName>";
    request.objectKey = @"<objectKey>";
    request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];
    // Set callback parameters
    request.callbackParam = @{
                              @"callbackUrl": @"http://abc.com/callback.php",
                              @"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"
                              };
    // Set custom variables
    request.callbackVar = @{
                            @"x:photo": @"iphone6s",
                            @"x:system": @"ios9.1"
                            };
  • Android のデータコールバックサンプルコード
    PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentType("application/octet-stream");
    put.setMetadata(metadata);
    put.setCallbackParam(new HashMap<String, String>() {
        {
            put("callbackUrl", "http://abc.com/callback.php");
            put("callbackBody", "filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}");
        }
    });
    put.setCallbackVars(new HashMap<String, String>() {
         {
             put("x:photo", "IPOHE6S");
             put("x:system", "YunOS5.0");
         }
    });

アプリサーバーのデータコールバック要件

  • POST リクエストを受信するためのサービスを配置する必要があります。 このサービスには、www.abc.com/callback.php (またはインターネット IP アドレス) などのパブリックアドレスが必要です。パブリックアドレスが無い場合、OSS はこのアドレスにアクセスできません。

  • OSS に返されるカスタムコンテンツの形式を JSON に設定する必要があります。 OSS は、アプリサーバーから受信したコンテンツをそのまま Android / iOS モバイルアプリに配信します。 (OSS に返される 応答ヘッダーは、コンテンツ長ヘッダーを持っている必要があります)

最後のセクションでは、ダウンロードリンクおよび実行方法と併せて、複数のプログラミング言語に基づくサンプルコールバックプログラムを提供します。

アプリサーバーが受信したコールバック要求

アプリサーバーが OSS から受信するコールバック要求のパケットは次のとおりです (データは URL やコールバック内容によって異なります)。

POST /index.html HTTP/1.0
Host: 121.43.113.8
Connection: close
Content-Length: 81
Content-Type: application/x-www-form-urlencoded
User-Agent: ehttp-client/0.0.1
authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA==
x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==
filename=test.txt&size=5&photo=iphone6s&system=ios9.1

詳しくは、「Callback API Documentation」をご参照ください。

アプリサーバーは、OSS からコールバック要求が送信されたかどうかをどのように判断しますか。

アプリケーションサーバーは、ネットワーク攻撃中に悪意のあるコールバックがあった場合、通常のロジックに影響を及ぼす無効な要求を受信する可能性があるため、コールバック要求が OSS からのものであるかどうかを判断する必要があります。

リクエストの正当性を検証するため、アプリサーバーは x-oss-pub-key-url および OSS がアプリサーバーに送信するコンテンツ内のauthorizationパラメーターを使用し、RSA チェックサムを検証します。 RSA チェックサム検証に適合した要求だけが OSS より送信されます。 このドキュメントのサンプルプログラムでは、参照用として実装結果も示しています。

アプリサーバーは受信したコールバック要求をどのように処理しますか。

OSS からの要求を検証した後、アプリサーバーはその内容に基づき、要求を処理します。 Android / iOS モバイルアプリは、データをアップロードするときにコールバックコンテンツの形式を指定します。次に例を示します。
filename=test.txt&size=5&photo=iphone6s&system=ios9.1

アプリサーバーは OSS から返されたコンテンツを解析して、予想されるデータを取得します。 その後、アプリサーバーはその後の管理のため、データを保存します。

アプリサーバーは OSS にコールバック要求をどのように返しますか。

  • 返される状態コードは、200 です。
  • 返されるコンテンツは 、JSON 形式を使用している必要があります。
  • 返されるコンテンツは、コンテンツ長ヘッダーを持っている必要があります。

OSS はアプリサーバーから返されたコンテンツをどのように処理しますか。

2 つのシナリオがあります。

  • アプリサーバーがコールバック要求の受信に失敗した場合、またはアクセスできない場合、OSS は Android / iOS モバイルアプリに状態コード 203 を返します。 しかし、アップロードされたデータはすでに OSS に保存されています。

  • アプリサーバーがコールバック要求を受信して正しい状態コードを返した場合、OSS はアプリサーバーから受信したコンテンツをそのまま 200 ステータスコードと併せて、Android / iOS モバイルアプリに返します。

ダウンロード用のサンプルコールバックプログラム

サンプルプログラムは、アプリケーションサーバーが受信した署名を確認する方法を示します。 サンプルプログラムは、アプリケーションサーバーが受信した署名を確認する方法を示します。

  • Java のバージョン:
    • ダウンロードアドレス
    • 実行方法: アーカイブを展開し、java -jar oss-callback-server-demo.jar 9000 を実行します (9000 はポート番号であり、必要に応じて変更できます)。
      この jar ファイルは、java 1.7上で動作します。 問題が発生した場合は、提供されているコードに基づいて修正します。 これは maven プロジェクトです。
  • PHP のバージョン:
    • ダウンロードアドレス
    • 実行方法: プログラムを Apache 環境に配置します。 PHP 言語の特性上、ヘッダーの取得は環境に依存します。 ユーザー自身の環境に基づき、サンプルに修正を加えます。
  • Python のバージョン:
    • ダウンロードアドレス
    • 実行方法: アーカイブを展開してpython callback_app_server.pyを直接実行します。 プログラムはシンプルな HTTP サーバーを実装しています。 このプログラムを実行するには、RSA が依存するシステム環境をインストールする必要があります。
  • Ruby のバージョン: