このトピックでは、Object Storage service (OSS) に基づいてモバイルアプリの直接データ転送サービスを設定し、アップロードコールバックを設定する方法について説明します。
背景情報
モバイルアプリの直接データ転送の設定では、モバイルアプリのOSSベースの直接データ転送サービスを設定する方法について説明します。 OSSベースの直接転送サービスがAndroidまたはiOSアプリに設定された後、アプリユーザーがアップロード要求を送信すると、セキュリティトークンサービス (STS) トークンがアプリユーザーに発行されます。 アプリユーザーは、STSトークンを使用して、トークンが無効になるまで複数回OSSにデータをアップロードできます。 その結果、アプリサーバーは、アプリユーザーがアップロードしたデータを特定できず、アプリ開発者のデータ管理が複雑になります。 この問題に対処するために、OSSはアップロードコールバック機能を提供します。
手順
次の図は、アップロードコールバックの仕組みを示しています。
OSSがAndroidまたはiOSアプリから送信されたアップロードリクエストを受信すると (ステップ5) 、OSSはアップロードコールバックタスクをトリガーし (ステップ6) 、コールバックリクエストをアプリサーバーに送信します。 次に、アプリサーバーはOSSに応答を返し、OSSはその応答に基づいてアップロード結果をAndroidまたはiOSアプリに送信します (ステップ7) 。 詳細については、「コールバック」をご参照ください。
目的
アップロードコールバックを使用して、アップロードされたオブジェクトに関する基本情報をアプリサーバーに送信できます。
次の表に、返される基本情報に含めることができる変数を示します。 返されるコンテンツの形式は、AndroidまたはiOSアプリを使用してオブジェクトをアップロードするときに指定されます。
システム変数
説明
バケット
モバイルアプリを使用してオブジェクトがアップロードされるバケット。
object
モバイルアプリを使用してオブジェクトをOSSにアップロードした後のオブジェクトの名前。
etag
アップロードされたオブジェクトのETag。これは、モバイルアプリのユーザーに返されるアップロード結果に含まれるETagフィールドです。
size
アップロードされたオブジェクトのサイズ。
mimeType
アップロードされたデータのタイプ。
imageInfo.height
アップロードされた画像の高さ。
imageInfo.width
アップロードされた画像の幅。
imageInfo.format
アップロードされた画像の形式。 例: JPGとPNG。
アップロードコールバックを使用して、アプリサーバーのカスタムコールバックパラメーターを指定し、アプリクライアントに関する情報を取得できます。
たとえば、アプリ開発者であり、アプリのバージョン、オペレーティングシステムのバージョン、GPS座標、携帯電話のモデルに関する情報を取得したいとします。 この場合、AndroidまたはiOSアプリを使用してオブジェクトをアップロードするときに、アプリに次のカスタムパラメーターを指定できます。
x:version: アプリのバージョン
x:system: オペレーティングシステムのバージョン
x:gps: GPS座標
x:phone: 携帯电话モデル
上記のパラメーターを設定した後、これらのパラメーターは、AndroidまたはiOSアプリクライアントがオブジェクトをOSSにアップロードするときに実行されます。 次に、OSSはこれらのパラメーターをcallbackBodyに含め、callbackBodyをアプリサーバーに送信します。 このようにして、アプリサーバーはアプリクライアントに関する情報を受け取ります。
アップロードコールバックのアプリサーバーの要件
POSTリクエストを受信するサービスがデプロイされます。 このサービスにはパブリックIPアドレスが必要です。 例:
http://example.com/callback.php
。このサービスはOSSに正しく応答する必要があり、応答はJSON形式である必要があります。 カスタムレスポンスを指定できます。 OSSは、アプリサーバーからAndroidまたはiOSアプリに応答を返します。 詳細については、「コールバック」をご参照ください。
モバイルアプリ側でのアップロードコールバック要求の設定
OSSがアップロードリクエストを受信したときにアップロードコールバックをトリガーするには、モバイルアプリでアップロードリクエストを作成して、次のコンテンツをアップロードリクエストに含める必要があります。
callbackUrl: コールバックリクエストの送信先のアプリサーバーのURL (
http://example.com/callback.php
など) 。 このURLはインターネット経由でアクセスできる必要があります。callbackBody: 前述のシステム変数OSSがアプリサーバーに戻ります。 callbackBodyで返される1つ以上の変数を指定できます。
たとえば、あなたはアプリ開発者であり、アプリサーバーのURLはhttp://example.com/callback.php
です。 オブジェクト名とサイズを取得し、携帯電話モデルとしてx:phoneを、オペレーティングシステムのバージョンとしてx:systemを指定します。
次のセクションでは、アップロードコールバックの2種類のリクエストについて説明します。
iOSアプリでのアップロードコールバック要求の例:
OSSPutObjectRequest * request = [OSSPutObjectRequest new]; request.bucketName = @ "<bucketName>"; request.objectKey = @ "<objectKey>"; request.uploadingFileURL = [NSURL fileURLWithPath:@ "<filepath>"]; // コールバックパラメーターを設定します。 request.callbackParam = @{ @ "callbackUrl": @ "http://example.com/callback.php" 、 @ "callbackBody": @ "filename =${ object}&size =${ size}&phone =${ x:phone}&system =${ x:system}" }; // 変数を指定します。 request.callbackVar = @{ @ "x:phone": @ "iphone6s" 、 @"x:system": @"ios9.1" };
Androidアプリでのアップロードコールバック要求の例:
PutObjectRequest put = new PutObjectRequest(testBucket、testObject、uploadFilePath); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("application/octet-stream"); put.setMetadata (メタデータ); put.setCallbackParam(new HashMap<String, String>() { { put("callbackUrl" 、"http://example.com/callback.php"); put("callbackBody", "filename =${ object}&size =${ size}&phone =${ x:phone}&system =${ x:system}"); } }); put.setCallbackVars(new HashMap<String, String>() { { 置く ("x: 電話" 、"iPhone 6s"); put("x:system", "YunOS5.0"); } });
アプリサーバーが受信したアップロードコールバック要求のサンプル
アプリサーバーが受信するアップロードコールバック要求は、上記のcallbackUrlおよびcallbackBodyの設定によって異なります。 例:
POST /index.html HTTP/1.0
ホスト: 203.0.113.0
接続: 閉じる
コンテンツ-長さ: 81
コンテンツタイプ: application/x-www-form-urlencoded
ユーザーエージェント: http-client/0.0.1
承認: kKQeGTRccDKyHB3H9vF + xYMSrmhMZjzzl2/kdD1ktNVgbWE **** G0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA=
x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNv **** YWxsYmFja19wdWJfa2V5X3YxLnBlbQ==
filename=test.txt&size=5&phone=iphone6s&system=ios9.1
詳細については、「コールバック」をご参照ください。
アプリサーバーは、アップロードコールバック要求がOSSから送信されるかどうかを判断します
アプリサーバーが攻撃されて無効なリクエストを受信した場合、アプリサーバーはコールバックリクエストがOSSから送信されたかどうかを判断する必要があります。
コールバック要求がOSSから送信されたかどうかを判断するために、アプリサーバーは、ossから送信されたx-OSS-pub-key-url
およびauthorization
レスポンスヘッダーに対してRSA署名検証を実行します。 RSA署名検証に合格したコールバック要求のみがOSSから送信されます。 このトピックで提供されるサンプルプログラムには、RSA署名検証用のヘッダーが含まれています。
アプリサーバーはコールバック要求を処理します
コールバック要求がOSSから送信されたとアプリサーバーが判断すると、アプリサーバーへのコールバック要求の形式が指定されます。 例:
filename=test.txt&size=5&phone=iphone6s&system=ios9.1
アプリサーバーは、OSSによって送信されたコンテンツを解析して、目的のデータを取得できます。 データが取得された後、アプリサーバは、その後の管理のためにデータを記憶することができる。
OSSはアプリサーバーからの応答を処理します
次のいずれかのシナリオが発生する可能性があります。
OSSはコールバック要求をアプリサーバーに送信します。 アプリサーバーがリクエストを受信できないか、アクセスできません。 その場合、OSSはHTTPステータスコード203をAndroidまたはiOSアプリに送信します。 ただし、データはOSSに保存されています。
アプリサーバーはOSSからコールバック要求を受信し、OSSに適切に応答します。 その場合、OSSはHTTPステータスコード200と、アプリサーバーからAndroidまたはiOSアプリに応答を返します。
サンプルプログラムのダウンロード
サンプルプログラムは、アプリサーバーが受信した署名のみを調べます。 アプリサーバーが受信したコールバックリクエストの形式を解析するために実行されるコードを手動で追加する必要があります。
Java
ダウンロードURL: ここをクリック。
サンプルプログラムを実行するには、ダウンロードしたパッケージを解凍し、java -jar oss-callback-server-demo.jar 9000を実行します。 9000はデフォルトのポートです。 このポート番号は変更できます。
説明JARパッケージの例は、OSS SDK for Java 1.7で実行されます。 エラーが発生した場合は、サンプルコードに基づいてコードを変更します。 このパッケージには、Mavenプロジェクトのコードが含まれています。
PHP
ダウンロードURL: ここをクリック。
サンプルプログラムを実行するには、ダウンロードしたパッケージをApache環境に解凍します。 この特定の環境は、PHP固有の機能のためにいくつかのヘッダーを取得する必要があります。 実際の環境に基づいてサンプルコードを変更します。
Python
ダウンロードURL: ここをクリック。
サンプルプログラムを実行するには、ダウンロードしたパッケージを解凍し、python callback_app_server.pyを実行します。 このプログラムは、単純なHTTPサーバとして機能する。 このプログラムを実行するには、RSAの依存関係をインストールする必要があります。
Ruby
ダウンロードURL: ここをクリック。
サンプルプログラムを実行するには、ruby server.rbコマンドを実行します。
よくある質問
コールバックURLを変更し、別のサーバーを使用してコールバックを受信し、アップロードが成功したかどうかを確認できますか?
パラメーターはOSSサーバーによって署名および検証されており、改ざんされたコンテンツは検証に合格できないため、コールバックURLを変更することはできません。