本文介紹如何在30分鐘內搭建一個基於OSS的行動裝置 App數據直傳服務。直傳指的是行動裝置 App數據的上傳和下載直接連接OSS,只有控制流程串連自己的伺服器。

背景

在移動互聯的時代,手機app上傳的數據越來越多。作為開發人員,您可以利用OSS處理各種資料存放區需求,從而更加專註於自己的應用邏輯。

基於OSS的行動裝置 App數據直傳服務具有以下優勢:
  • 數據安全:使用靈活的授權和鑒權方式進行數據的上傳和下載,更加安全。
  • 成本低廉:您不需要準備很多伺服器。行動裝置 App直接連接雲端儲存OSS,只有控制流程串連應用伺服器。
  • 高並發:支援海量用戶並發訪問。
  • 彈性擴容:無限擴容的儲存空間。
  • 資料處理:和圖片處理以及音視頻轉碼搭配使用,方便靈活地進行資料處理。

下載並安裝行動裝置 App

行動裝置 App源碼的下載地址如下:

您可以通過此行動裝置 App上傳圖片到OSS。上傳的方法支援普通上傳和斷點續傳上傳。在網路環境差的情況下,推薦使用斷點續傳上傳。您還可以利用圖片處理服務,對要上傳的圖片進行縮略和加浮水印處理。樣本應用的最終效果圖如下:

  • 應用伺服器:該行動裝置 App對應的後台應用伺服器。請使用步驟2:下載應用伺服器程式碼範例中提供的應用伺服器程式碼範例,部署自己的應用伺服器。
  • 上傳Bucket:該行動裝置 App要把數據上傳到哪個Bucket。
  • 區域:上傳Bucket所在的地域。

原理介紹

行動裝置 App直傳服務的架構圖如下所示:

  • Android/iOS 行動裝置 App:即終端使用者手機上的app。
  • OSS:即阿里雲對象儲存,負責儲存app上傳的數據。
  • RAM/STS:負責生成臨時上傳憑證,即Token。
  • 應用伺服器:即提供該Android/iOS應用的開發人員開發的app後台服務,用於管理app上傳和下載的Token,以及用戶通過app上傳數據的元資訊。

實現步驟如下:

  1. 行動裝置 App嚮應用伺服器申請一個臨時上傳憑證。
    说明
    Android和iOS應用不能直接儲存AccessKey,這樣會存在數據泄露的風險。所以應用必須向用戶的應用伺服器申請一個Token。這個Token是有時效性的,如果Token的過期時間是30分鐘(由應用伺服器指定),那麼在這30分鐘裡,該Android/iOS應用可以使用此Token從OSS上傳和下載數據, 30分鐘後需要重新獲取Token。
  2. 應用伺服器檢測上述請求的合法性,然後返回Token給行動裝置 App。
  3. Android/iOS行動裝置 App使用此Token將數據上傳到OSS,或者從OSS下載數據。

以下介紹應用伺服器如何生成Token以及Android/iOS行動裝置 App如何獲取Token。

步驟1:建立Bucket並開通STS服務

  1. 開通OSS,並且建立Bucket
  2. 開通STS服務。
    1. 登入OSS管理主控台
    2. 在OSS概覽頁中找到基礎配置區域,單擊安全性權杖

    3. 進入到安全性權杖快捷配置頁面,單擊開始授權
      说明
      如果沒有開通RAM,會彈出開通的對話方塊。單擊開通。開通完成後單擊開始授權
    4. 系統進行自動授權。請保存AccessKeyID、AccessKeySecret和RoleArn三個參數。
      • 如果您未建立過AccessKey,系統自動建立AccessKey。請保存AccessKeyId、AccessKeySecret和RoleArn,如下圖所示。


      • 如果您之前已經建立過AccessKey,也可以單擊如下圖所示的查看建立新的AccessKey。

步驟2:下載應用伺服器程式碼範例

步驟3:修改設定檔

以下例子採用PHP編寫。每個語言的範例程式碼下載後,都會有一個設定檔config.json,如下所示:
{
"AccessKeyID" : "",
"AccessKeySecret" : "",
"RoleArn" : "",
"TokenExpireTime" : "900",
"PolicyFile": "policy/all_policy.txt"
}
相關參數說明如下:
  • AccessKeyID:填寫之前記錄的AccessKeyID。
  • AccessKeySecret:填寫之前記錄的AccessKeySecret。
  • RoleArn:填寫之前記錄的RoleArn。
  • TokenExpireTime:指Android/iOS應用獲取到的Token的失效時間,最小值和預設值均為900s。
  • PolicyFile:該Token所擁有的許可權列表的檔案,可使用預設值。
    说明

    程式碼範例中提供了三種最常用的Token許可權檔案,位於policy目錄下面。分別是:

    • all_policy.txt:指定該Token擁有該帳號下的所有許可權,包括:
      • 建立Bucket
      • 刪除Bucket
      • 上傳檔案
      • 下載檔案
      • 刪除檔案
    • bucket_read_policy.txt:指定該Token擁有該帳號下指定Bucket的讀許可權。
    • bucket_read_write_policy.txt:指定了該Token擁有該帳號下指定Bucket的讀寫權限。
    如果您想要指定該Token只對指定的Bucket有讀寫權限, 請把bucket_read_policy.txt和bucket_read_write_policy.txt檔案裡的$BUCKET_NAME替換成指定的Bucket名稱。

步驟4:運行範例程式碼

程式碼範例的運行方法如下:
  • 對於PHP版本,將包下載解壓後,修改config.json檔案,直接運行php sts.php即能生成Token,將程式部署到指定的應用伺服器位址。
  • 對於Java版本(依賴於java 1.7),將包下載解壓後,修改config.json檔案,運行java -jar oss-token-server.jar (port)。如果不指定port(通信埠),直接運行java –jar oss-token-server.jar,程式會監聽7080通信埠。

返回的資料格式解析如下:

//正確返回
{
    "StatusCode":200,
    "AccessKeyId":"STS.3p***dgagdasdg",
    "AccessKeySecret":"rpnwO9***tGdrddgsR2YrTtI",
   "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙∂˙∂3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVtbzI=",
   "Expiration":"2017-12-12T07:49:09Z",
}
//錯誤返回
{
    "StatusCode":500,
    "ErrorCode":"InvalidAccessKeyId.NotFound",
    "ErrorMessage":"Specified access key is not found."
}
正確返回的五個變數構成一個Token:
  • StatusCode:獲取Token的狀態,獲取成功時,傳回值是200。
  • AccessKeyId:Android/iOS行動裝置 App初始化OSSClient獲取的 AccessKeyId。
  • AccessKeySecret:Android/iOS行動裝置 App初始化OSSClient獲取AccessKeySecret。
  • SecurityToken:Android/iOS行動裝置 App初始化的Token。
  • Expiration:該Token失效的時間。Android SDK會自動判斷Token是否失效,如果失效,則自動獲取Token。
錯誤返回說明如下:
  • StatusCode:表示獲取Token的狀態,獲取失敗時,傳回值是500。
  • ErrorCode:表示錯誤原因。
  • ErrorMessage:表示錯誤的具體資訊描述。

步驟5:體驗行動裝置 App直傳服務

  1. 部署程式後,記下應用伺服器位址如http://abc.com:8080,將樣本程式裡面的應用伺服器修改成上述地址。
  2. 選擇數據要上傳到哪個Bcuket及地域,修改樣本程式裡相應的上傳Bucket區域
  3. 單擊設定,載入配置。
  4. 選擇圖片,設定上傳OSS檔案名,上傳圖片。
  5. 上傳成功後,通過控制台查看上傳結果。

核心代碼解析

OSS初始化的代碼解析如下:

  • Android版本
    // 推薦使用OSSAuthCredentialsProvider,token過期後會自動刷新。
    String stsServer = "應用伺服器位址,例如http://abc.com:8080"
    OSSCredentialProvider credentialProvider = new OSSAuthCredentialsProvider(stsServer);
    //config
    ClientConfiguration conf = new ClientConfiguration();
    conf.setConnectionTimeout(15 * 1000); // 連接逾時時間,預設15秒
    conf.setSocketTimeout(15 * 1000); // Socket逾時時間,預設15秒
    conf.setMaxConcurrentRequest(5); // 最大並發請求數,預設5個
    conf.setMaxErrorRetry(2); // 失敗後最大重試次數,預設2次
    OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
  • iOS版本
    OSSClient * client;
    ...
    // 推薦使用OSSAuthCredentialProvider,token過期後會自動刷新。
    id<OSSCredentialProvider> credential = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:@"應用伺服器位址,例如http://abc.com:8080"];
    client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];