全部產品
Search
文件中心

Object Storage Service:快速搭建行動裝置 App直傳服務

更新時間:Feb 28, 2024

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

前提條件

背景資訊

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

基於OSS的行動裝置 App資料直傳服務具有以下優勢:

  • 資料安全:使用靈活的授權和鑒權方式進行資料的上傳和下載,更加安全。

  • 成本低廉:您不需要準備很多伺服器。行動裝置 App直接連接雲端儲存OSS,只有控制流程串連應用伺服器。

  • 高並發:支援海量使用者並發訪問。

  • 彈性擴容:無限擴容的儲存空間。

  • 資料處理:和圖片處理以及音視頻轉碼搭配使用,方便靈活地進行資料處理。

流程介紹

行動裝置 App直傳服務的開發流程如下:

角色分析如下:

  • Android/iOS 行動裝置 App:即終端使用者手機上的App,負責從應用伺服器申請及使用STS憑證。

  • OSS:即阿里雲Object Storage Service,負責處理行動裝置 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:開通STS服務並配置應用伺服器

快速部署

您可以使用Resource Orchestration Service開通STS服務並一鍵配置1個Elastic Compute Service執行個體,然後在Elastic Compute Service執行個體上部署應用伺服器源碼。使用Resource Orchestration Service快速開通STS服務並配置應用伺服器的操作步驟如下。

  1. 開啟一鍵配置模板連結

  2. 資源編排 ROS控制台,輸入資源棧名稱,設定新購ECS的可用性區域、執行個體類型、系統硬碟類型、執行個體密碼,然後單擊創建

    資源棧的資源棧資訊頁簽下的狀態顯示建立中

  3. 資源棧的狀態顯示建立成功後,單擊輸出頁簽,查看一鍵部署的Elastic Compute Service執行個體。

手動部署

  1. 登入OSS管理主控台

  2. 單擊左側導覽列的概覽

  3. 大家都在用地區,單擊安全性權杖(子帳號授權) > 前往RAM控制台

    sts

  4. 單擊開始授權。並按照提示完成授權。

    授權完成後,儲存RAM使用者的AccessKey ID、AccessKey Secret和RoleArn三個參數。token

  5. 下載並解壓應用伺服器代碼。

    PHP

    sts-server.zip

    Java

    AppTokenServerDemo.zip

    Ruby

    sts-app-server-master.zip

    Node.js

    sts-app-server-node.zip

    Go

    test_token_server.zip

  6. 修改設定檔config.json

    設定檔樣本如下:

    {
    "AccessKeyID" : "",
    "AccessKeySecret" : "",
    "RoleArn" : "",
    "TokenExpireTime" : "900",
    "PolicyFile": "policy/bucket_write_policy.txt"
    }

    參數說明如下:

    參數

    說明

    AccessKeyID

    填寫您記錄的AccessKey ID。

    AccessKeySecret

    填寫您記錄的AccessKey Secret。

    RoleArn

    填寫您記錄的RoleArn。

    TokenExpireTime

    表示Android、iOS應用擷取到的Token的失效時間,最小值和預設值均為900s。

    PolicyFile

    Token所擁有的許可權列表的檔案,可保留預設值。

    policy目錄下提供了以下兩種最常用的Token許可權檔案:

    • bucket_read_policy.txt:指定該Token擁有該帳號下指定Bucket及指定首碼的讀許可權。

    • bucket_write_policy.txt:指定該Token擁有該帳號下指定Bucket及指定首碼的寫入權限。

    使用Token許可權檔案時,需要把相應的許可權檔案中的$BUCKET_NAME(Bucket名稱)和$OBJECT_PREFIX(檔案首碼)替換成指定的值。

    如果您需要設定不同情境下的Policy,請參見RAM Policy概述中的Policy樣本和構建方法。

    警告
    • 請務必根據業務需要,按照最小許可權原則進行授權。如果您直接授予所有資源(resource:*),或者所有操作(action:*)許可權,則存在由於許可權範圍過大導致的資料安全風險。

    • 本程式碼範例僅供參考,實際業務務必根據不同使用者或裝置進行許可權隔離,產生帶有不同許可權的Token。

  7. 運行範例程式碼。

    PHP

    1. 運行以下命令,產生Token。

      php sts.php
    2. 將程式部署到指定的應用伺服器位址。

    Java

    說明

    Java依賴為1.7。

    1. 運行以下命令,啟動服務。

      java -jar app-token-server.jar (port)

      如果不指定port(連接埠),預設監聽7080連接埠。支援自訂需要監聽的連接埠,但不允許與已有的連接埠重複。

    2. 調用AssumeRole返回結果。

      返回結果解析如下:

      // 正確返回。
      {
          // 擷取Token的狀態,擷取成功時,傳回值是200。
          "StatusCode":200,
          // Android、iOS行動裝置 App初始化OSSClient擷取的AccessKey ID。
          "AccessKeyId":"STS.3p***dgagdasdg",
          // Android、iOS行動裝置 App初始化OSSClient擷取的AccessKey Secret。
          "AccessKeySecret":"rpnwO9***tGdrddgsR2YrTtI",
          // Android、iOS行動裝置 App初始化OSSClient擷取的Token。
          "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙∂˙∂3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVt****",
          // 該Token失效的時間。Android SDK會自動判斷Token是否失效,如果失效,會重新自動擷取Token。
          "Expiration":"2017-12-12T07:49:09Z"
      }
      // 錯誤返回。
      {
          // 擷取Token的狀態。擷取失敗時,傳回值是500。
          "StatusCode":500,
          // 錯誤原因。
          "ErrorCode":"InvalidAccessKeyId.NotFound",
          // 錯誤描述。
          "ErrorMessage":"Specified access key is not found."
      }

步驟2:下載並安裝行動裝置 App

  1. 下載行動裝置 App源碼。

    Android

    下載地址

    iOS

    下載地址

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

  2. 開啟行動裝置 App,配置應用參數。

    • 應用伺服器:填寫步驟1:配置應用伺服器中部署的應用伺服器位址。

    • 上傳Bucket:該行動裝置 App要把資料上傳到哪個Bucket。

    • 地區:上傳Bucket所在的地區。

    • OSS檔案名稱:需要包含應用伺服器Policy設定檔裡指定的首碼。

  3. 單擊設定

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

  1. 開啟行動裝置 App。

  2. 單擊選擇圖片,選擇需要上傳的圖片,並設定OSS檔案名稱。

  3. 上傳成功後,通過控制台查看上傳結果。

核心代碼解析

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

Android

// 推薦使用OSSAuthCredentialsProvider,Token到期後會自動重新整理。
String stsServer = "應用伺服器位址,例如https://example.com:8080"
OSSCredentialProvider credentialProvider = new OSSAuthCredentialsProvider(stsServer);
// 完成以下配置項。
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:@"應用伺服器位址,例如https://example.com:8080"];
client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];