全部產品
Search
文件中心

:Android應用整合SDK

更新時間:Jul 01, 2024

本文介紹了為您的Android應用整合WAF App防護SDK(以下簡稱SDK)的操作方法。您必須在應用中整合SDK,才能為應用開啟App防護。

使用限制

Android應用的API版本必須是16及以上,否則無法正常使用SDK。

前提條件

  • 已開通WAF App防護模組且開啟了App防護狀態開關。

    相關操作,請參見如何為應用開啟App防護

  • 已擷取Android應用對應的SDK。

    您開通WAF App防護模組後,請提交工單,聯絡產品技術專家擷取SDK。

    Android應用對應的SDK包含1個AAR檔案,檔案名稱為AliTigerTally_X.Y.Z.aar,其中X.Y.Z表示版本號碼。

  • 已擷取SDK認證密鑰(即appkey)。

    您在Web Application Firewall控制台防護配置 > 網站防護頁面開啟App防護後,即可單擊擷取並複製appkey,擷取SDK認證密鑰。該密鑰用於發起SDK初始化請求,需要在整合代碼中使用。

    說明

    每個阿里雲帳號擁有唯一的appkey(適用於所有接入WAF防護的網域名稱),且Android和iOS應用整合SDK時都使用該appkey

    App防護

    認證密鑰樣本:

    ****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****

背景資訊

App防護SDK主要用於對通過App用戶端發起的請求進行簽名。WAF服務端通過校正App請求籤名,識別App業務中的風險、攔截惡意請求,實現App防護的目的。

建立一個測試工程(可選)

您可以直接在真實的Android工程中整合SDK,或者先建立一個測試工程進行測試,等熟悉操作後,再在真實環境中進行操作。

以Android Studio工具為例,建立一個測試用Android工程,並按照設定精靈完成建立。

本文將測試工程命名為TigerTally_sdk_test,建立好的工程目錄如下圖所示。測試Demo在整合SDK前,請確認測試工程可以正常運行。測試工程運行

操作步驟

  1. 使用Android Studio開啟App工程,進入檔案目錄。

  2. 引用AAR包。

    1. 將您擷取的AliTigerTally.aar檔案複製到libs目錄(可以直接拖放進去)。複製到libs目錄

    2. 開啟build.gradle檔案,修改以下配置:

      • libs目錄添加為尋找依賴的源。

        repositories{
           flatDir {
             dirs 'libs'
           }
        }
      • 添加編譯依賴。

        重要

        您需要將以下代碼中AliTigerTally檔案的版本號碼(X.Y.Z)替換成您擷取的AAR檔案的版本號碼。

        dependencies {
          compile(name: 'AliTigerTally_X.Y.Z', ext: 'aar')
        }
    3. 在頁面上方的提示資訊中,單擊Sync Now,將修改的配置同步到專案中。

  3. 添加SO引用。

    如果您的專案已經使用過SO,請跳過該步驟;如果專案在此之前未使用過SO,請在build.gradle中添加以下配置:

    android {
        defaultConfig {
        ndk {
            abiFilters 'arm64-v8a', 'x86', "armeabi-v7a"
            //abiFilters "armeabi-v7a"
          }
        }
    }
  4. 為應用申請以下許可權。

    許可權

    是否必須

    說明

    android.permission.INTERNET

    用於串連網路。

    android.permission.ACCESS_NETWORK_STATE

    用於擷取裝置的網路狀態。

    android.permission.ACCESS_WIFI_STATE

    用於擷取裝置的WIFI狀態。

    android.permission.READ_PHONE_STATE

    用於讀取裝置狀態和身份。

    重要

    該許可權在Android 6.0及以上需要動態申請。

    android.permission.BLUETOOTH

    用於擷取裝置的藍芽許可權。

    android.permission. READ_EXTERNAL_STORAGE

    用於讀取裝置的外部儲存。

    重要

    該許可權在Android 6.0及以上需要動態申請。

    android.permission.CHANGE_NETWORK_STATE

    用於修改裝置的網路狀態。

  5. 添加整合代碼。

    1. 設定使用者標識。

      介面定義:

      int setAccount(String account);

      功能:設定您業務中自訂的終端使用者標識,方便您更靈活地配置WAF防護策略。

      介面參數:<account>,String類型,表示標識一個使用者的字串(建議您使用脫敏後的格式)。

      傳回值:int類型,返回是否設定成功,0表示成功,-1表示失敗。

      範例程式碼:

      final String account="account";
      TigerTallyAPI.setAccount(account); // 如果當前登入的使用者是遊客身份,可以跳過這步,直接調用初始化函數。
    2. SDK初始化。

      介面定義:

      int init(Context context, String appkey, int type);

      功能:初始化SDK,執行一次初始化採集。一次初始化採集表示採集一次終端裝置資訊,您可以根據業務的不同,重新調用init函數進行初始化採集。

      初始化採集分為兩種模式:採集全量資料、採集除需授權欄位外的資料(不採集涉及終端裝置使用者隱私的欄位,包括:imei、imsi、simSerial、wifiMac、wifiList、bluetoothMac)。

      說明

      建議您在終端使用者同意App的隱私政策前,採集除需授權欄位外的資料;在終端使用者同意App的隱私政策後,再採集全量資料。採集全量資料有利於更好地識別風險。

      介面參數:

      • <context>:Context類型,傳入您應用的上下文。

      • <appkey>:String類型,設定為您的SDK認證密鑰。

      • <type>:CollectType類型,設定採集模式。取值:

        • DEFAULT:表示採集全量資料。

        • NO_GRANTED:表示採集除需授權欄位外的資料。

        傳回值:int類型,返回初始化結果,0表示成功,-1表示失敗。

      範例程式碼:

      final String appkey="your_appkey";
      // 採集全量資料。
      int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.DEFAULT);
      // 採集除需授權欄位外的資料。
      int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.NOT_GRANTED);
      Log.d("AliSDK", "ret:" + ret);
    3. 簽章要求資料。

      介面定義:

      String vmpSign(int signType, byte[] input);

      功能:對輸入的資料進行簽名,並且返回簽名串。

      介面參數:

      • <signType>:int類型,取值固定為1,表示預設的簽名演算法。

      • <input>:byte[]類型,表示待簽名的資料。

        待簽名資料一般是整個請求體(RequestBody)。 如果請求體為空白(例如,POST請求的Body為空白或者使用了GET請求),則設定成Null 物件(null)或者Null 字元串的Bytes值(例如,"".getBytes("UTF-8"))。

      傳回值:String類型,返回簽名串。

      範例程式碼:

      說明

      範例程式碼中將簽名串定義為wToken

      String request_body = "i am the request body, encrypted or not!";
      String wToken = null;
      try {
          wToken = TigerTallyAPI.vmpSign(1, request_body.getBytes("UTF-8"));
      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      }
      Log.d("AliSDK", "wToken:" + wToken);
    4. 將簽名串添加到HTTP協議頭。

      例如,如果您的專案使用HttpURLConnection,則可以將簽名串(wToken)欄位的內容添加到HttpURLConnection類的對象中。

      範例程式碼:

      String request_body = "i am the request body, encrypted or not!";
      new Thread(new Runnable() {
          @Override
          public void run() {
              try {
                  URL url = new URL("https://www.aliyundoc.com");
                  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                  conn.setReadTimeout(5000);
                  conn.setRequestMethod("POST");
                  // set wToken info to header
                  conn.setRequestProperty("wToken", wToken);
                  OutputStream os = conn.getOutputStream();
                  // set request body info
                  byte[] requestBody = request_body.getBytes("UTF-8");
                  os.write(requestBody);
                  os.flush();
                  os.close();
                  int code = conn.getResponseCode();
                  Log.d("respCode", Integer.toString(code));
              } catch (MalformedURLException e) {
                  e.printStackTrace();
              } catch (UnsupportedEncodingException e) {
                  e.printStackTrace();
              } catch (ProtocolException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          };
          }).start();
    5. 將修改好HTTP協議頭的資料發送到應用伺服器。

      WAF服務端獲得應用伺服器收到的請求後,通過解析簽名串(wToken)進行風險識別、攔截惡意請求,然後將合法請求轉寄回來源站點。

介面混淆配置

如果您使用ProGuard進行代碼混淆,則可以使用-keep選項對SDK的介面函數進行設定,保護SDK介面函數不被移除混淆。

範例程式碼:

-keep class com.aliyun.TigerTally.* {*;}