产品动态
安全公告
产品公告
setting.gradle 或项目 build.gradle 中添加 Maven 源:// setting.gradle 或项目 build.gradlerepositories {// 增加下面maven配置maven { url 'https://repo.maven.apache.org/maven2/' } // 示例Maven源,请替换为实际SDK提供的Maven源}
build.gradle 中添加依赖:// app/build.gradledependencies {implementation 'com.tencent.cloud:clientattestation:latest.release'}
AndroidManifest.xml 权限AndroidManifest.xml 文件中添加以下权限声明,以确保 SDK 能够正常进行网络通信:<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 { *; }
Application 类或应用启动时执行一次。import com.tencent.cloud.clientattestation.TCBas;import com.tencent.cloud.clientattestation.TCBasOptions;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// SDK初始化String baseUrl = "www.example.com"; // 设置为业务域名TCBas.init(getApplicationContext(), new TCBasOptions.Builder().baseUrl(baseUrl).build());// 可选:设置日志级别// TCBas.init(getApplicationContext(), new TCBasOptions.Builder()// .baseUrl(baseUrl)// .logLevel(LOG_LEVEL_DEBUG) // 可选,设置日志级别// .build());}}
baseUrl: 您的 EdgeOne 服务域名,例如 www.example.com。logLevel: 可选参数,用于控制 SDK 的日志输出级别。可选值包括:LOG_LEVEL_NONE: 关闭日志(默认)LOG_LEVEL_DEBUG: 打开 debug 以上级别日志LOG_LEVEL_INFO: 打开 info 以上级别日志LOG_LEVEL_WARN: 打开 warning 以上级别日志LOG_LEVEL_ERROR: 打开 error 以上级别日志import com.tencent.cloud.clientattestation.ClientAttestation;// 启动客户端认证引擎ClientAttestation.getInstance().start();
WebView 中显示验证码)并计算认证令牌。这是通过 SDK 提供的 attestWithParams() 方法完成的。import com.tencent.cloud.clientattestation.AttestCallback;import com.tencent.cloud.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) // 验证码界面显示使用的WebView,如果不需要图形验证码则不用设置此参数.reqTimeoutMillis(60000) // 可选,请求超时时间,单位:毫秒,默认60秒.build();ClientAttestation.getInstance().attestWithParams(params, new AttestCallback() {@Overridepublic void onSuccess(String token) {// 返回风险票据,把票据放在http请求中的header字段‘EO-Attest-Token’// 例如:您可以在这里重新发送之前失败的请求,并带上新的token}@Overridepublic void onError(int errorCode, String msg) {// 错误信息回调// errorCode: 错误码// msg: 错误信息}});
attestId: 配置挑战 ID,从控制台获取或请求结果返回。webView: 可选参数,一个 WebView 实例。当认证器需要用户交互(如验证码)时,必须提供此参数。如果不需要 UI 交互,WebView 可以是隐藏的。reqTimeoutMillis: 可选参数,设置请求超时时间,单位:毫秒,默认 60 秒。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;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 实例将在应用内部显示验证码页面,因此需要预先设置以确保正确显示。WebView 实例作为 JavaScript 运行时环境,主要用于执行加密工作量证明 (PoW) 挑战。在此场景下,WebView 实例仅提供 JavaScript 执行沙箱,无需可见地渲染任何 UI。因此,传入的 WebView 实例无需可见,SDK 也不会将其用于 UI 渲染。文档反馈