setting.gradle またはプロジェクトの build.gradle に Maven リポジトリを追加します:// setting.gradle またはプロジェクトの build.gradlerepositories {// 以下の maven 設定を追加します。maven { url 'https://repo.maven.com/' } // サンプルMavenリポジトリです。実際のSDKが提供するMavenリポジトリに置き換えてください。}
build.gradle に依存関係を追加します:// app/build.gradledependencies {implementation 'com.tencent.cloud:clientattestation:latest.release'}
AndroidManifest.xmlの権限を設定するAndroidManifest.xml ファイルに以下の権限宣言を追加してください:<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
app/build.gradle の defaultConfig に以下を追加します:android {defaultConfig {ndk {abiFilters "armeabi-v7a", "arm64-v8a" // 選択可能:armeabi-v7a または arm64-v8a}}}
proguard-rules.pro)に以下の難読化ルールを追加して、SDK 内部クラスが難読化されないようにしてください:-keep class com.**.TNative$aa { public *; }-keep class com.**.TNative$aa$bb { public *; }-keep class com.**.TNative$bb { *; }-keep class com.**.TNative$bb$I { *; }-keep class com.tcbas.**{*;}
Application クラスまたはアプリケーション起動時に一度実行されます。import com.tcbas.common.framework.TCBas;import com.tcbas.common.framework.TCBasConfig;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// SDK初期化String baseUrl = "www.example.com"; // 業務ドメインに設定します。TCBas.init(getApplicationContext(), new TCBasConfig.Builder().baseUrl(baseUrl).build());// 任意:ログレベルを設定します。// TCBas.init(getApplicationContext(), new TCBasConfig.Builder()// .baseUrl(baseUrl)// .logLevel(LOG_LEVEL_DEBUG) // 任意:ログレベルを設定します。// .build());// 任意:AndroidIdを設定します。// TCBas.init(getApplicationContext(), new TCBasConfig.Builder()// .baseUrl(baseUrl)// .logLevel(LOG_LEVEL_DEBUG) // 任意:ログレベルを設定します。// .extraDataProvider(new ExtraDataProvider(){// @Override// public String getAndroidId() {// return super.getAndroidId();// }// })// .build());}}
baseUrl:お客様の EdgeOne サービスドメインです。例:www.example.com。extraDataProvider:任意パラメータです。AndroidIdを提供し、リスク識別能力を向上させます。logLevel:任意パラメータです。SDKのログ出力レベルを制御するために使用されます。選択可能な値は以下の通りです:LOG_LEVEL_NONE:ログを無効にします(デフォルト)。LOG_LEVEL_DEBUG:debug以上のレベルのログを有効にします。LOG_LEVEL_INFO:info以上のレベルのログを有効にします。LOG_LEVEL_WARN:warning以上のレベルのログを有効にします。LOG_LEVEL_ERROR:error以上のレベルのログを有効にします。import com.tc.eo.clientattestation.ClientAttestation;クライアント認証エンジンを起動します。ClientAttestation.getInstance().start();
WebViewにCaptchaを表示します)、認証トークンを計算します。これは、SDKが提供するattestWithParams()メソッドによって実行されます。import com.tc.eo.clientattestation.ClientAttestation;import com.tc.eo.clientattestation.AttestCallback;import com.tc.eo.clientattestation.AttestParams;import android.webkit.WebView;// attestId// 主動的にチャレンジを開始する際にコンソールから取得します。// 受動的にチャレンジが開始された際に、httpが返すheaderフィールド内の「EO-Attest-Challenge」から取得します。String attestId = "your-attestId";AttestParams params = new AttestParams.Builder().attestId(attestId).webView(yourWebViewInstance) // Captcha画面の表示に使用するWebViewです。Captchaが不要な場合は、このパラメータを設定する必要はありません。.reqTimeoutMillis(60000) // オプション、リクエストタイムアウト時間、単位:ミリ秒、デフォルト60秒.build();ClientAttestation.getInstance().attestWithParams(params, new AttestCallback() {@Overridepublic void onSuccess(String token) {// リスクチケットを返し、チケットをhttpリクエストのheaderフィールド「EO-Attest-Token」に配置します。// 例えば:ここで以前失敗したリクエストを再送し、新しいトークンを付与できます。}@Overridepublic void onError(int errorCode, String msg) {// エラーメッセージのコールバック// errorCode: エラーコード// msg: エラーメッセージ}});
attestId: チャレンジIDを設定します。コンソールから取得するか、リクエスト結果から返されます。webView: オプションのパラメータで、WebViewインスタンスです。認証器がユーザー操作(Captchaなど)を必要とする場合、このパラメータを提供する必要があります。UI操作が不要な場合、WebViewは非表示にすることができます。captchaDisplayType: オプションのパラメータで、インタラクティブなCaptcha UIの表示モードです。ポップアップ全画面表示を使用する場合はCaptchaDisplayType.POPUPを使用し、ページ内への埋め込み表示を使用する場合はCaptchaDisplayType.FULLを使用します。デフォルト値:CaptchaDisplayType.POPUP。reqTimeoutMillis: オプションのパラメータで、リクエストタイムアウト時間を設定します。単位:ミリ秒、デフォルトは60000ミリ秒です。getAttestationToken()メソッドを呼び出すことで、現在有効な認証トークンをいつでも取得できます。attestWithParams() の呼び出しが成功するたびに、SDK は認証トークンを生成または更新します。トークンをリクエストヘッダーに付与する前に、必ず再度 getAttestationToken() を呼び出して最新のトークンを取得してください。トークンデータを使用する必要があるたびに、新しいトークンデータを再取得してください。getAttestationToken() が返すトークンデータを保存または再利用しないでください。// クライアント認証チケットを取得します。String attestToken = ClientAttestation.getInstance().getAttestationToken();// 例:トークンをネットワークリクエストヘッダーに追加します。// OkHttp または他のネットワークライブラリを使用していると仮定します。if (attestToken != null) {// OkHttp の例// Request originalRequest = new Request.Builder()// .url("https://your-backend-api.com/data")// .build();// Request.Builder requestBuilder = originalRequest.newBuilder();// requestBuilder.header("EO-Attest-Token", attestToken);// Request request = requestBuilder.build();// // 引き続きリクエストを送信します。}
import okhttp3.Call;import okhttp3.Callback;import okhttp3.Headers;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import java.io.IOException;import android.webkit.WebView;import com.tc.eo.clientattestation.ClientAttestation;import com.tc.eo.clientattestation.AttestCallback;import com.tc.eo.clientattestation.AttestParams;public class ApiClient {private OkHttpClient client = new OkHttpClient();private WebView webViewInstance; // WebViewインスタンスがあると仮定します。public ApiClient(WebView webView) {this.webViewInstance = webView;}public void makeProtectedRequest(String url) {Request request = new Request.Builder().url(url).header("EO-Attest-Token", ClientAttestation.getInstance().getAttestationToken()).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// ネットワークリクエストの失敗を処理します。e.printStackTrace();}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.code() == 428) {Headers headers = response.headers();String challengeId = headers.get("EO-Attest-Challenge");if (challengeId != null) {// 428チャレンジを受信したら、認証を実行します。AttestParams params = new AttestParams.Builder().attestId(challengeId).webView(webViewInstance) // WebViewインスタンスを渡します。.build();ClientAttestation.getInstance().attestWithParams(params, new AttestCallback() {@Overridepublic void onSuccess(String token) {// 認証が成功したため、リクエストを再送信します。makeProtectedRequest(url); // 元のリクエストを再発行します。}@Overridepublic void onError(int errorCode, String msg) {// 認証に失敗しました。System.err.println("認証失敗: " + msg);}});} else {System.err.println("428 レスポンスに EO-Attest-Challenge ヘッダーが見つかりません");}} else if (response.isSuccessful()) {// リクエストが成功し、ビジネスデータを処理します。System.out.println("リクエスト成功: " + response.body().string());} else {// その他のHTTPエラーを処理します。System.err.println("リクエスト失敗: " + response.code() + " " + response.message());}}});}}
WebViewを使用したインタラクティブ認証(およびJS認証)WebView(Android プラットフォーム)がこれらの機能を実現するための重要なコンポーネントです。attestWithParams() メソッドを呼び出す際に WebView インスタンスを提供することを要求します。これは、開発者がアプリケーション内で事前に WebView インスタンスを割り当て、認証 API を呼び出す際にそれをパラメータとして SDK に渡す必要があることを意味します。WebView インスタンスを必要とします。この WebView インスタンスはアプリケーション内部で Captcha ページを表示するため、正しく表示されるように事前に設定する必要があります。WebView インスタンスを必要とし、主に暗号化による作業証明(PoW)チャレンジの実行に使用されます。このシナリオでは、WebView インスタンスは JavaScript 実行サンドボックスのみを提供し、UI を可視的にレンダリングする必要はありません。したがって、渡される WebView インスタンスは可視である必要はなく、SDK もそれを UI レンダリングに使用しません。フィードバック