Android アプリでアプリ保護を有効にするには、この機能を有効化する前に Anti-Bot SDK (このトピックでは SDK と呼びます) を統合する必要があります。
制限事項
Android API レベル 16 以降が必要です。ご利用のアプリがこれより前の API レベルをターゲットにしている場合、SDK は期待どおりに動作しません。
前提条件
開始する前に、以下をご確認ください。
アプリ保護を購入し、有効化していること。詳細については、「アプリ保護を有効にする手順」をご参照ください。
Android 向けの SDK パッケージ (AAR ファイル) を取得していること。これを取得するには、DingTalk サービスグループでテクニカルサポートに連絡するか、チケットを起票してください。ファイル名は
AliTigerTally_X.Y.Z.aarで、X.Y.Zはバージョン番号です。アプリケーションキー (SDK 認証キー) を取得していること。取得するには、WAF コンソールにログインし、[保護設定] > [ウェブサイト保護] を選択し、[ボット管理] タブに移動して [アプリ保護] をオンにし、[Appkey の取得とコピー] をクリックします。
各 Alibaba Cloud アカウントには、ご利用の Web Application Firewall (WAF) インスタンス内のすべてのドメイン名、および Android と iOS の両方のアプリで機能する一意のアプリケーションキーが 1 つあります。アプリケーションキーの例:
****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****仕組み
SDK は、アプリからの各送信リクエストに署名します。WAF はこれらの署名をサーバー側で検証して不正なトラフィックを検出しブロックした後、正当なリクエストをオリジンサーバーに転送します。
(任意) テスト用の Android プロジェクトの作成
本番アプリに適用する前に統合手順を試したい場合は、まず Android Studio でテスト用のプロジェクトを作成します。
次の図は、TigerTally_sdk_test という名前のサンプルテストプロジェクトを示しています。
先に進む前に、テストプロジェクトを実行して動作することを確認してください。
SDK の統合
ステップ 1:Android Studio でプロジェクトを開く
Android Studio でプロジェクトを開き、プロジェクトのファイルディレクトリに移動します。
ステップ 2:AAR 依存関係の追加
AliTigerTally.aarをプロジェクトのlibsディレクトリにコピーします。ファイルをディレクトリに直接ドラッグすることもできます。
build.gradleを開き、次の構成を追加します。libsをローカルリポジトリとして宣言します。repositories { flatDir { dirs 'libs' } }コンパイル依存関係を追加します。
dependencies { compile(name: 'AliTigerTally_X.Y.Z', ext: 'aar') }重要:
X.Y.Zは、ダウンロードした AAR ファイル名の実際のバージョン番号に置き換えてください。
[今すぐ同期] をクリックして変更を適用します。
ProGuard を使用してアプリを難読化する場合は、依存関係を追加した直後に、次のルールを ProGuard 設定ファイルに追加します。これにより、ビルド時に SDK クラスが削除され、ランタイムエラーが発生するのを防ぎます。
-keep class com.aliyun.TigerTally.* {*;}
ステップ 3:(必要な場合) ネイティブライブラリフィルターの設定
プロジェクトに SO ファイルがすでに含まれている場合は、このステップをスキップしてください。そうでない場合は、次の ndk ブロックを build.gradle に追加します。
android {
defaultConfig {
ndk {
abiFilters 'arm64-v8a', 'x86', 'armeabi-v7a'
//abiFilters "armeabi-v7a"
}
}
}ステップ 4:権限の申請
次の権限を AndroidManifest.xml に追加します。SDK が機能するために必須なのは INTERNET のみです。
| 権限 | 必須 | ランタイムリクエスト (Android 6.0 以降) | 説明 |
|---|---|---|---|
android.permission.INTERNET | はい | いいえ — インストール時に自動的に付与されます | SDK が署名付きリクエストを WAF に送信することを許可します。 |
android.permission.ACCESS_NETWORK_STATE | いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するために、デバイスのネットワーク状態を読み取ります。 |
android.permission.ACCESS_WIFI_STATE | いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するために、Wi-Fi 接続状態を読み取ります。 |
android.permission.READ_PHONE_STATE | いいえ | はい — ランタイムでのリクエストが必要です | リスクシグナルを強化するために、デバイス ID を読み取ります。 |
android.permission.BLUETOOTH | いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するために、Bluetooth デバイス情報を読み取ります。 |
android.permission.READ_EXTERNAL_STORAGE | いいえ | はい — ランタイムでのリクエストが必要です | リスクシグナルを強化するために、外部ストレージを読み取ります。 |
android.permission.CHANGE_NETWORK_STATE | いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するために、ネットワーク接続状態を変更します。 |
ステップ 5:統合コードの追加
5a. (任意) ユーザー ID の設定
setAccount() を呼び出して、ユーザー ID を SDK リクエストに関連付けます。これにより、WAF がユーザーレベルの保護ポリシーを適用しやすくなります。ユーザーがログインしていない場合はこの呼び出しをスキップし、代わりに init() を直接呼び出してください。
// シグネチャ: int setAccount(String account)
// 戻り値: 成功した場合は 0、失敗した場合は -1
final String account = "account"; // マスクされたユーザー ID を使用します
TigerTallyAPI.setAccount(account);| パラメーター | 型 | 説明 |
|---|---|---|
account | String | ユーザー ID。ユーザーのプライバシーを保護するために、マスクされた値を使用してください。 |
5b. SDK の初期化
アプリの起動時に init() を一度だけ呼び出します。これにより、リスク分析に使用されるデバイス情報が一度だけ収集されます。
2 つの収集モードが利用可能です。
`DEFAULT`:機密フィールド (
imei、imsi、simSerial、wifiMac、wifiList、bluetoothMac) を含むすべてのデバイスデータを収集します。対応する権限が必要です。ユーザーがアプリのプライバシーポリシーに同意した後に、このモードを使用してください。`NOT_GRANTED`:機密フィールドをスキップします。ユーザーがプライバシーポリシーに同意する前に、このモードを使用してください。
// シグネチャ: int init(Context context, String appkey, int type)
// 戻り値: 成功した場合は 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);| パラメーター | 型 | 説明 |
|---|---|---|
context | Context | アプリケーションコンテキスト。 |
appkey | String | WAF コンソールから取得したアプリケーションキー。 |
type | CollectType | データ収集モード:DEFAULT または NOT_GRANTED。 |
5c. リクエストへの署名
各送信 HTTP リクエストの前に vmpSign() を呼び出します。リクエストボディをバイト配列として渡します。GET リクエストや空の POST ボディの場合は、null または "".getBytes("UTF-8") を渡してください。
// シグネチャ: String vmpSign(int signType, byte[] input)
// 戻り値: 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);| パラメーター | 型 | 説明 |
|---|---|---|
signType | int | 署名アルゴリズム。デフォルトのアルゴリズムを使用するには 1 に設定します。 |
input | byte[] | 署名するリクエストボディ。GET リクエストまたは空の POST リクエストの場合は、null または空のバイト配列を渡します。 |
5d. HTTP ヘッダーへの署名の追加
リクエストを送信する前に、wToken の値を HTTP ヘッダープロパティとして設定します。次の例では 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");
// wToken 署名をリクエストヘッダーに追加します
conn.setRequestProperty("wToken", wToken);
OutputStream os = conn.getOutputStream();
// リクエストボディを書き込みます
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();統合後の動作
統合後、アプリが送信するすべてのアウトバウンドリクエストに対して、次の処理が行われます。
vmpSign()がリクエストボディからwToken署名を生成します。ご利用のコードが
wTokenを HTTP ヘッダーとしてアタッチします。WAF が
wTokenヘッダーを検査し、署名検証に失敗したリクエストをブロックし、有効なリクエストをオリジンサーバーに転送します。
アプリケーションキーの例: