Android アプリに Device Fraud Detection SDK を統合して、デバイス信号を収集し、サーバー側のリスクアセスメントに使用するデバイストークンを取得します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Android 4.0.3 以降を対象とする Android アプリ(
minSdkVersionは 15 以上に設定)Alibaba Cloud 公式ウェブサイトで公開されている最新版 SDK(プライバシーに関するコンプライアンス要件を満たすために必須)
権限
SDK では、1 つの必須権限と、いくつかの任意権限が必要です。検出精度を向上させるため、SDK の初期化前に任意権限を付与してください。
| 権限 | 必須 | 説明 |
|---|---|---|
android.permission.INTERNET | はい | ネットワークへのアクセス。この権限がない場合、SDK のコア機能は利用できません。 |
android.permission.ACCESS_NETWORK_STATE | 推奨 | デバイスのネットワーク状態を読み取ります。 |
android.permission.READ_PHONE_STATE | 推奨 | Android 6.0 以降では、データ収集関数を呼び出す前に、この権限を動的に付与してください。 |
android.permission.WRITE_EXTERNAL_STORAGE | 推奨 | |
android.permission.READ_EXTERNAL_STORAGE | 推奨 |
SDK のダウンロードと構成
Android SDK パッケージをダウンロードし、解凍します。パッケージは標準の
.aar(Android Archive)ファイルです。.aarファイルをプロジェクトのlibsディレクトリにコピーします。アプリの
build.gradleファイルに、以下の依存関係を追加します。// Device Fraud Detection SDK implementation files('libs/Android-AliyunDevice-<version>.aar') // 必須のネットワークライブラリ依存関係 implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okio:okio:1.14.0'重要ネットワークライブラリの依存関係を追加してください。これらの依存関係がないと、SDK がインターネットに接続できなくなります。
データの収集
ユーザーからのプライバシー同意を取得した後、アプリのライフサイクルのできるだけ早い段階(理想的には Application.onCreate() 内)で、initWithOptions を呼び出します。SDK は収集されたデバイス信号を用いてデバイストークンを生成します。
アカウント登録、ログイン、キャンペーン参加など、デバイスレベルの詐欺信号が特に重要となるリスクに敏感なエントリポイントで、この関数を呼び出してください。
関数シグネチャ
public interface SecurityInitListener {
// code:データ収集の成功/失敗を示すステータスコード
void onInitFinish(int code);
}
public void initWithOptions(
Context ctx,
String appKey,
Map<String, String> options,
SecurityInitListener securityInitListener
);パラメーター
`ctx`
Application Context または Activity Context。
`appKey`
アプリの ID キーです。Fraud Detection コンソール の Device APP 管理 タブから取得します。
`options`
データ収集の任意構成です。すべてのデータをデフォルト設定で収集する場合は、null を渡します。
| パラメーター | 説明 | 例 |
|---|---|---|
IPv6 | デバイス情報を報告する際の IP バージョン。0(デフォルト):IPv4。1:IPv6。 | "1" |
CustomUrl | データ受信用の自社管理サーバーのドメイン名。 | "https://cloudauth-device.aliyuncs.com" |
CustomHost | データ受信用の自社管理サーバーのホスト名。 | "cloudauth-device.aliyuncs.com" |
DataType | 収集から除外する機密データの種類。デフォルトは空(すべてのデータを収集)。複数の値は | で区切ります。 | "NO_UNIQUE_DEVICE_DATA" または "NO_UNIQUE_DEVICE_DATA|NO_IDENTIFY_DEVICE_DATA" |
DataType パラメーターには、以下の値を指定できます。
| 値 | 除外されるデータ | 影響を受けるフィールド |
|---|---|---|
NO_UNIQUE_DEVICE_DATA | リセット可能なデバイス識別子 | オープン匿名デバイス識別子(OAID)、Google 広告 ID、Android ID |
NO_IDENTIFY_DEVICE_DATA | 非リセット可能なデバイス識別子 | 国際移動体設備識別番号(IMEI)、国際移動体加入者識別番号(IMSI)、SimSerial、BuildSerial(SN)、MAC アドレス |
NO_BASIC_DEVICE_DATA | 基本デバイス情報 | デバイス名(Build.DEVICE)、Android バージョン(Build.VERSION#RELEASE)、画面の解像度 |
NO_EXTRA_DEVICE_DATA | 拡張機密情報 | 不正取引向けアプリリスト、LAN の IP アドレス、DNS の IP アドレス、接続中の Wi-Fi(SSID、BSSID)、近隣 Wi-Fi リスト、位置情報 |
`securityInitListener`
データ収集完了時に呼び出されるコールバックです。code パラメーターを使用して結果を確認してください。詳細については、「ステータスコード」をご参照ください。
戻り値:なし。
デバイストークンの取得
initWithOptions の呼び出し後、少なくとも 2 秒待ってから、バックグラウンドスレッドから getDevicetoken を呼び出してデバイストークンを取得します。取得したトークンをアプリケーションサーバーに送信し、サーバー側で Device Fraud Detection API を呼び出してデバイスのリスク情報を照会します。
getDevicetokenはバックグラウンドスレッドから呼び出してください。メインスレッドから呼び出すと、アプリケーションが応答しない(ANR)エラーが発生します。initWithOptionsの呼び出し後、getDevicetokenを呼び出すまでに少なくとも 2 秒待ってください。良好なネットワーク接続ではトークン長は約 600 バイトですが、通信環境が悪い場合は最大 2.5 KB になります。
関数シグネチャ
public class Securitytoken {
// トークン取得の成功/失敗を示すステータスコード
public int code;
// サーバー側でリスク判定結果を照会する際に使用するトークン文字列
public String token;
}
public Securitytoken getDevicetoken();戻り値
getDevicetoken は、2 つのフィールドを持つ Securitytoken オブジェクトを返します。
code:操作の成功/失敗を示すステータスコード。詳細については、「ステータスコード」をご参照ください。token:Device Fraud Detection API を呼び出す際に使用するトークン文字列。トークンの有効期間は 7 日間であり、複数回のサーバー側 API 呼び出しで再利用できます。
サンプルコード
以下の例では、Application.onCreate() でデータ収集を初期化し、ユーザー登録やキャンペーン参加などのリスクに敏感なイベント発生時にバックグラウンドスレッドからデバイストークンを取得する、完全な統合手順を示します。
Java
public class CustomApplication extends Application {
// Fraud Detection コンソールの Device APP 管理タブから取得した appKey
private static final String ALIYUN_APPKEY = "xxxx";
@Override
public void onCreate() {
super.onCreate();
// プライバシー要件を満たすため、非リセット可能なデバイス識別子を除外。
// 複数の DataType 値は | で区切ります。
Map<String, String> options = new HashMap<>();
options.put("DataType", "NO_IDENTIFY_DEVICE_DATA");
// プライバシー同意を取得した直後に、できるだけ早期に initWithOptions を呼び出します。
SecurityDevice.getInstance().initWithOptions(this, ALIYUN_APPKEY, options, null);
}
}アプリの初期化後、リスクに敏感なイベント発生時にバックグラウンドスレッドからデバイストークンを取得します。initWithOptions の呼び出し後、getDevicetoken を呼び出すまでに少なくとも 2 秒待ってください。
new Thread() {
@Override
public void run() {
Securitytoken st = SecurityDevice.getInstance().getDevicetoken();
if (st != null) {
if (SecurityCode.SC_SUCCESS == st.code) {
Log.d("AliyunDevice", "token: " + st.token);
// トークンをアプリケーションサーバーに送信します。
// サーバーはこのトークンを用いて Device Fraud Detection API を呼び出します。
// sendToAppServer(st.token);
} else {
Log.e("AliyunDevice", "getDevicetoken エラー、コード: " + st.code);
}
} else {
Log.e("AliyunDevice", "getDevicetoken が null を返しました。");
}
}
}.start();Kotlin
class CustomApplication : Application() {
// Fraud Detection コンソールの Device APP 管理タブから取得した appKey
private val ALIYUN_APPKEY = "xxxx"
override fun onCreate() {
super.onCreate()
// プライバシー要件を満たすため、非リセット可能なデバイス識別子を除外。
val options = HashMap<String, String>()
options["DataType"] = "NO_IDENTIFY_DEVICE_DATA"
// プライバシー同意を取得した直後に、できるだけ早期に initWithOptions を呼び出します。
SecurityDevice.getInstance().initWithOptions(this, ALIYUN_APPKEY, options, null)
}
}コルーチンディスパッチャーを使用してバックグラウンドスレッドからデバイストークンを取得します。initWithOptions の呼び出し後、getDevicetoken を呼び出すまでに少なくとも 2 秒待ってください。
// メインスレッドをブロックしないよう Dispatchers.IO を使用(ANR エラーを防止)
CoroutineScope(Dispatchers.IO).launch {
val st = SecurityDevice.getInstance().getDevicetoken()
if (st != null) {
if (SecurityCode.SC_SUCCESS == st.code) {
Log.d("AliyunDevice", "token: ${st.token}")
// トークンをアプリケーションサーバーに送信します。
// サーバーはこのトークンを用いて Device Fraud Detection API を呼び出します。
// sendToAppServer(st.token)
} else {
Log.e("AliyunDevice", "getDevicetoken エラー、コード: ${st.code}")
}
} else {
Log.e("AliyunDevice", "getDevicetoken が null を返しました。")
}
}難読化
SDK が難読化されないように、ProGuard 構成に以下のルールを追加してください。
-keep class net.security.device.api.** {*;}
-dontwarn net.security.device.api.**ステータスコード
SecurityCode | コード | 説明 |
|---|---|---|
SC_SUCCESS | 10000 | データ収集に成功しました。 |
SC_NOT_INIT | 10001 | データ収集に失敗しました。 |
SC_NOT_PERMISSION | 10002 | 1 つ以上の必須 Android 権限が付与されていません。 |
SC_UNKNOWN_ERROR | 10003 | 不明なシステムエラーが発生しました。 |
SC_NETWORK_ERROR | 10004 | ネットワークエラーが発生しました。 |
SC_NETWORK_ERROR_EMPTY | 10005 | ネットワークエラーが発生し、戻り値が空文字列です。 |
SC_NETWORK_ERROR_INVALID | 10006 | 応答フォーマットが無効です。 |
SC_PARSE_SRV_CFG_ERROR | 10007 | サーバー側の設定の解析に失敗しました。 |
SC_NETWORK_RET_CODE_ERROR | 10008 | ゲートウェイからエラーが返されました。 |
SC_APPKEY_EMPTY | 10009 | appKey パラメーターが空です。 |
SC_PARAMS_ERROR | 10010 | パラメーターのエラーが発生しました。 |
SC_FGKEY_ERROR | 10011 | キーの計算に失敗しました。 |
SC_APPKEY_ERROR | 10012 | SDK のバージョンと appKey のバージョンが一致しません。 |
Device Fraud Detection API の呼び出し
アプリケーションサーバーがデバイストークンを受信した後、そのトークンとその他のイベントパラメーターを用いて Device Fraud Detection API を呼び出し、デバイスのリスク判定結果を取得します。
リクエストおよびレスポンスパラメーターの全一覧については、「Device Fraud Detection のサービスイベントパラメーターおよびレスポンスパラメーター」をご参照ください。
よくある質問
SDK がサポートする CPU アーキテクチャは何ですか?
SDK は ARM、ARMv7、ARM64 アーキテクチャをサポートしています。
SDK パッケージのサイズはどのくらいですか?
単一アーキテクチャの共有オブジェクト(SO)ファイルは約 1.8 MB です。パッケージが大きい理由は、リバースエンジニアリング防止および通信中のデータ保護のため、難読化、膨張、暗号操作が含まれているためです。
デバイストークンの有効期間はどれくらいですか?再利用できますか?
デバイストークンの有効期間は 7 日間です。この期間内であれば、複数回のサーバー側 API 呼び出しで同じトークンを再利用できます。