背景

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



角色分析如下所示:

  • 應用伺服器負責為Android/iOS行動裝置 App生成STS憑證。

  • Android/iOS行動裝置 App負責從應用伺服器申請及使用STS憑證。

  • OSS負責處理行動裝置 App的數據請求。

對於Android/iOS移動應來說,行動裝置 App只需要執行上圖中操作1(申請STS憑證),就能調用多次5(使用該STS憑證上傳數據到OSS),導致應用伺服器根本不知道用戶都上傳了哪些數據 ,作為該APP的開發人員,就沒法對應用上傳數據進行管理。有什麼問題能讓應用伺服器感知到Android/iOS行動裝置 App上傳的數據呢?

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



OSS在收到Android/iOS移動的數據(上圖中操作5)和在返回用戶上傳結果(上圖中操作6)之間,觸發一個上傳回調工作。即第上圖中操作5.5,先回調使用者服務器,得到應用伺服器返回的內容,將這個內容返回給Android/iOS行動裝置 App。可以參考Callback API文檔

上傳回調的作用

  • 通過上傳回調可以讓用戶應用伺服器知道當前上傳檔案的基本資料。

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

    系統變數 含義
    bucket 行動裝置 App上傳到哪個儲存空間
    object 行動裝置 App上傳到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行動裝置 App上傳到OSS時附帶上,OSS會把這些值放到CallbackBody裡面一起發給應用伺服器。這樣應用伺服器就能收到這些資訊,達到資訊傳遞的目的。

在行動裝置 App端設定上傳回調

要讓OSS在接收上傳請求時,觸發上傳回調,行動裝置 App在構造上傳請求時必須把如下兩個內容指定到上傳請求裡面:

  • 要回調到哪個伺服器callbackUrl,如 http://abc.com/callback.php,這個地址必須是公網能夠訪問的。
  • 上傳回調給應用伺服器的內容callbackBody,可以是上述OSS返回應用伺服器系統變數的一個或者多個。

假如您的使用者服務器上傳回調地是http://abc.com/callback.php。您想獲取手機上傳的檔案名字、檔案的大小,並且定義了photo變數是指手機型號,system是指作業系統版本。

上傳回調樣本分以下兩種:

  • iOS指定上傳回調樣本:
    OSSPutObjectRequest * request = [OSSPutObjectRequest new];
    request.bucketName = @"<bucketName>";
    request.objectKey = @"<objectKey>";
    request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];
    // 設定回調參數
    request.callbackParam = @{
                              @"callbackUrl": @"http://abc.com/callback.php",
                              @"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"
                              };
    // 設定自訂變數
    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行動裝置 App。(切記,返回給OSS的Response Header一定要加上Content-Length這個頭部)。

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

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

應用伺服器收到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文檔

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

如果您的回調伺服器被人惡意攻擊了,例如惡意回調您的應用伺服器,導致應用伺服器收到一些非法的請求,影響正常邏輯,此時您就需要判斷回調請求是否來自OSS。

判斷的方法主要是利用OSS給應用伺服器返回的頭部內容中, x-oss-pub-key-urlauthorization這兩個參數進行RSA校驗。只有通過RSA校驗才能說明這個請求是來自OSS,本教程提供的樣本程式都有實現的樣本供您參考。

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

應用伺服器在校驗這個請求是來自OSS後,指定回調給應用伺服器的內容格式,如
filename=test.txt&size=5&photo=iphone6s&system=ios9.1

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

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

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

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

有兩種情況:

  • OSS將回調請求發送給應用伺服器,但是應用伺服器接收失敗或者訪問不通,OSS會返回給Android/iOS行動裝置 App203的狀態碼,但是數據已經存放到OSS上了。

  • 應用伺服器接收到OSS的回調請求,並且正確返回了,OSS會返回給Android/iOS行動裝置 App狀態碼是200, 並把應用伺服器給OSS的內容,原封不動地返回給Android/iOS行動裝置 App。

上傳回調伺服器樣本程式下載

樣本程式只是完成了如何檢查應用伺服器收到的簽名, 用戶要自行增加對應用伺服器收到回調的內容的格式解析 。

  • 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。