閱讀448 返回首頁    go windows


快速搭建移動應用上傳回調服務__移動應用端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲

背景

快速搭建移動應用直傳服務介紹了如何在30分鍾內中搭建一個基於OSS的移動應用數據直傳服務。移動端開發場景流程圖如下:

角色解析

  • Android/iOS移動應用負責申請STS憑證,然後使用從應用服務器獲取的憑證上傳。
  • 應用服務器負責為Android/iOS移動應用生成STS憑證。
  • OSS負責處理移動應用的數據請求。

問題

對於Android/iOS移動應來說,移動應用隻需要執行操作1(申請STS憑證),就能調用多次5(使用該STS憑證上傳數據到OSS)。這樣就導致了應用服務器根本不知道用戶都上傳了哪些數據 ,如果那麼作為該APP的開發者,就沒法對應用上傳數據進行管理。所以,有什麼問題能讓應用服務器感知到Android/iOS移動應用上傳的數據呢?

答案

通過使用OSS的上傳回調服務,就能解決上述問題,如下圖:

即OSS在收到Android/iOS移動的數據(第5步)和在返回用戶上傳結果(第6步)之間,觸發一個上傳回調工作。即第5.5步。先回調用戶服務器,然後得到應用服務器返回的內容,將這個內容返回給Android/iOS移動應用。

可以參考Callback API文檔

上傳回調的作用

  • 通過上傳回調可以讓用戶應用服務器知道當前上傳文件的基本信息。

    基本信息如下表。返回下述變量的一個或者多個,返回內容格式形式在Android/iOS上傳時指定。

係統變量 含義
bucket 移動應用上傳到哪個存儲空間
object 移動應用上傳到OSS保存的文件名
etag 該上傳的文件的etag,即返回給用戶的etag字段
size 該上傳的文件的大小
mimeType 資源類型
imageInfo.height 圖片高度
imageInfo.width 圖片寬度
imageInfo.format 圖片格式,如jpg、png,隻以識別圖片
  • 通過上傳回調設定自定義參數,達到信息傳遞目的。
    假如您是一個開發者,您想知道當前用戶所使用的APP版本、當前用戶所在的操作係統版本、用戶的GPS信息、用戶的手機型號。那麼您可以在Android/iOS端上傳文件時,指定上述自定義參數 ,如x:version指定APP版本,x:system指定操作係統版本,x:gps指定GPS信息,x:phone指定手機型號。這些值會在Android/iOS移動應用上傳到OSS時附帶上。然後OSS會把這些值放到CallbackBody裏麵,一起發給應用服務器。這樣應用服務器就能收到這些信息,達到信息傳遞的目的。

在移動應用端設定上傳回調

要讓OSS在接收上傳請求時,觸發上傳回調,那麼移動應用在構造上傳請求時必須把兩個內容指定到上傳請求裏麵。這兩個內容如下:

  1. 要回調到哪個服務器callbackUrl,如 https://abc.com/callback.php,注意這個地址必須是公網能夠訪問的。
  2. 上傳回調給應用服務器的內容callbackBody。可以是上述OSS返回應用服務器係統變量的一個或者多個。


舉個例子。假如您的用戶服務器上傳回調地是https://abc.com/callback.php。您想獲取手機上傳的文件名字、文件的大小,並且定義了photo變量是指手機型號,system是指操作係統版本。

iOS指定上傳回調示例

  1. OSSPutObjectRequest * request = [OSSPutObjectRequest new];
  2. request.bucketName = @"<bucketName>";
  3. request.objectKey = @"<objectKey>";
  4. request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];
  5. // 設置回調參數
  6. request.callbackParam = @{
  7. @"callbackUrl": @"https://abc.com/callback.php",
  8. @"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"
  9. };
  10. // 設置自定義變量
  11. request.callbackVar = @{
  12. @"x:photo": @"iphone6s",
  13. @"x:system": @"ios9.1"
  14. };

Android指定上傳回調示例

  1. PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);
  2. ObjectMetadata metadata = new ObjectMetadata();
  3. metadata.setContentType("application/octet-stream");
  4. put.setMetadata(metadata);
  5. put.setCallbackParam(new HashMap<String, String>() {
  6. {
  7. put("callbackUrl", "https://abc.com/callback.php");
  8. put("callbackBody", "filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}");
  9. }
  10. });
  11. put.setCallbackVars(new HashMap<String, String>() {
  12. {
  13. put("x:photo", "IPOHE6S");
  14. put("x:system", "YunOS5.0");
  15. }
  16. });

上傳回調對應用服務器的要求

  • 您必須部署一個可以接收POST請求的服務,這個服務必須有公網地址如www.abc.com/callback.php(或者外網IP也可以),不然OSS沒有辦法訪問到這個地址。
  • 您要給OSS正確的返回,返回格式必須是JSON格式,內容自定義。因為OSS會把應用服務器返回的內容,原封不動地返回給Android/iOS移動應用。(切記,返回給OSS的Response Header一定要加上Content-Length這個頭部)

本教程在最後為大家準備了多個語言版本的示例、下載及運行方法。

應用服務器收到的回調請求

應用服務器收到OSS的請求,抓包的請求如下(這個結果根據設定的不同URL和回調內容會有不同):

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

可以參考Callback API文檔

應用服務器判斷回調請求是否來自OSS

之所以要判斷回調請求是來自OSS,是因為如果您的回調服務器被人惡意攻擊了,別人惡意回調您的應用服務器,導致應用服務器收到一些非法的請求,影響正常邏輯。判斷的方法主要是利用OSS給應用服務器返回的頭部內容中, x-oss-pub-key-urlauthorization這兩個參數進行RSA校驗。隻有通過RSA校驗才能說明這個請求是來自OSS,本教程提供的示例程序都有實現的示例供您參考。

應用服務器收到回調請求後的處理

應用服務器在校驗這個請求是來自OSS後(這一步不是必要的),因為Android/iOS應用在上傳數據時,指定了回調給應用服務器的內容格式,如

  1. filename=test.txt&size=5&photo=iphone6s&system=ios9.1

應用服務器就可以根據OSS的返回內容,解析得到自己想要得到的數據。得到這個數據後,應用服務器可以把數據存放起來,方便後續管理。

應用服務器收到回調請求後如何返回給OSS

  • 返回狀態碼是200;
  • 返回必須是json格式的內容;
  • 返回的頭部必須帶有Content-Length這個頭部。

OSS如何處理應用服務器的返回內容

有兩種情況:

  • OSS將回調請求發送給應用服務器,但是應用服務器接收失敗或者訪問不通,OSS會返回給Android/iOS移動應用203的狀態碼,但是數據已經存放到OSS上了。
  • 應用服務器接收到OSS的回調請求,並且正確返回了,OSS會返回給Android/iOS移動應用狀態碼是200, 並把應用服務器給OSS的內容,原封不動地返回給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 server,運行該程序可能需要安裝rsa的依賴。

Ruby版本:

  • 下載地址:點擊這裏
  • 運行方法: ruby aliyun_oss_callback_server.rb

最後更新:2016-11-23 16:04:09

  上一篇:go 權限控製__移動應用端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲
  下一篇:go Web端直傳實踐簡介__Web端直傳實踐_最佳實踐_對象存儲 OSS-阿裏雲