背景

モバイルアプリの直接データ転送の設定では、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 をご覧ください。

データコールバック関数

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

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

    システム変数 意味
    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 アプリケーション用のデータコールバックサンプルコード:
    1. OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @”<bucketName>”;request.objectKey = @”<objectKey>”;request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>”];// Set callback parametersrequest.callbackParam = @{ @”callbackUrl”: @”http://abc.com/callback.php“, @”callbackBody”: @”filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}” };// Set custom variablesrequest.callbackVar = @{ @”x:photo”: @”iphone6s”, @”x:system”: @”ios9.1” };
  • Android アプリのデータコールバックサンプルコード:
    1. 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 に返されたレスポンスヘッダは、Content-Length ヘッダを保持しなければなりません)。

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

アプリサーバーが受信したコールバックリクエスト

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

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

詳細については、Callback を参照してください。

アプリケーションサーバーは、コールバックリクエストが OSS によって送信されるかどうかをどのように判断しますか?

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

要求の妥当性を判断するために、アプリケーションサーバーはx-oss-pub-key-url および 認証を使用して RSA チェックサムを検証します >パラメータを使用して、OSS がアプリケーションサーバーに送信します。 RSA チェックサム検証に合格した要求のみが OSS によって送信されます。 このドキュメントのサンプル・プログラムは、参照のための実装結果も提供します。

アプリケーションサーバーは受信したコールバックリクエストをどのように処理しますか?

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

アプリケーションサーバーは、OSS が返すコンテンツを解析して、期待されるデータを取得します。 その後、アプリケーションサーバーは、後続の管理のためにデータを保存します。

アプリケーションサーバはコールバックリクエストを OSS にどのように返すのですか?

  • 返されるステータスコードは 200 です。
  • 返されるコンテンツは、JSON 形式を使用する必要があります。
  • 返されるコンテンツには、Content-Length ヘッダーが含まれている必要があります。

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

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

  • アプリサーバーがコールバックリクエストの受信に失敗した場合、またはアクセスできない場合、OSS は 203 ステータスコードを Android/iOS モバイルアプリに返します。 ただし、アップロードされたデータはすでに 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 バージョン: