产品动态
安全公告
产品公告
Podfile 中添加以下内容:pod 'ClientAttestation', :podspec => './SDK'
pod install
Info.plist 权限Info.plist 文件中添加以下权限声明,以确保 SDK 能够正常进行网络通信:<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict><!-- 如果您的应用需要访问互联网,请确保已声明此权限 --><key>NSInternetPermission</key><true/>
NSAllowsArbitraryLoads 设置允许应用加载非 HTTPS 资源。在生产环境中,强烈建议您配置 ATS 例外,仅允许必要的域通过 HTTPS 访问,以增强安全性。AppDelegate 或应用启动时执行一次。import ClientAttestationfunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// SDK初始化let baseUrl = "www.example.com" // 设置为业务域名let basOptions = TCBasOptions()basOptions.baseUrl = baseUrlbasOptions.logLevel = LOG_LEVEL_DEBUG // 可选,设置日志级别TCBas.initialize(with: basOptions)return true}
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 以上级别日志// 启动客户端认证引擎[[ClientAttestation sharedInstance] start];
WKWebView 中显示验证码)并计算认证令牌。这是通过 SDK 提供的 attestWithParams() 方法完成的。// attestId// 主动发起挑战时从控制台获取// 被动发起挑战时从http返回的header字段中的‘EO-Attest-Challenge’获取NSString *attestId = @"your-attestId";AttestParams *params = [[AttestParams alloc] init];params.attestId = attestId;params.webView = webView; // 验证码界面显示使用的WebViewparams.reqTimeoutMillis = 60000; // 可选,请求超时时间[[ClientAttestation sharedInstance] attestWithParams:paramscallback:self];// 实现 AttestCallbackDelegate 协议#pragma mark - AttestCallbackDelegate- (void)onSuccess:(NSString *)token {// 返回风险票据,把票据放在http请求中的header字段‘EO-Attest-Token’}- (void)onError:(NSError *)error {// 错误信息回调}
attestId: 配置挑战 ID,从控制台获取或请求结果返回。webView: 可选参数,一个 WKWebView 实例。当认证器需要用户交互(如验证码)时,必须提供此参数。如果不需要 UI 交互,WKWebView 可以是隐藏的。reqTimeoutMillis: 可选参数,设置请求超时时间,单位:毫秒,默认 60000 毫秒。getAttestationToken() 方法随时获取当前有效的认证令牌。attestWithParams() 成功后,SDK 都会生成或更新认证令牌。在将令牌附加到请求头之前,务必再次调用 getAttestationToken() 获取最新的令牌,每次需要使用令牌数据时,请重新获取新的令牌数据。请勿保存或重复使用 getAttestationToken() 返回的令牌数据。// 获取客户端认证票据NSString *attestToken = [[ClientAttestation sharedInstance] getAttestationToken];// 示例:将令牌添加到您的网络请求头中// 假设您正在使用 URLSession 或其他网络库if (attestToken) {// 您的请求对象NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://your-backend-api.com/data"]];[request setValue:attestToken forHTTPHeaderField:@"EO-Attest-Token"];// 继续发送请求}
// 假设您的网络请求处理逻辑- (void)sendAPIRequest:(NSMutableURLRequest *)request {NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error) {NSLog(@"网络请求错误: %@", error.localizedDescription);return;}NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;if (httpResponse.statusCode == 428) {// 收到 428 挑战,提取挑战 IDNSString *challengeId = httpResponse.allHeaderFields[@"EO-Attest-Challenge"];if (challengeId) {NSLog(@"收到 428 挑战,挑战 ID: %@", challengeId);// 执行认证挑战// 根据需要创建或复用 WKWebView 实例WKWebView *webView = [[WKWebView alloc] init];AttestParams *attestParams = [[AttestParams alloc] init];attestParams.attestId = challengeId;attestParams.webView = webView;[[ClientAttestation sharedInstance] attestWithParams:attestParams callback:self];// 注意:这里需要处理 AttestCallbackDelegate 的回调,在 onSuccess 中重新发送请求} else {NSLog(@"428 响应中未找到 EO-Attest-Challenge 头");}} else if (httpResponse.statusCode == 200) {NSLog(@"请求成功!");// 处理业务数据} else {NSLog(@"请求失败,状态码: %ld", (long)httpResponse.statusCode);// 处理其他错误}}];[task resume];}// 示例调用// NSMutableURLRequest *initialRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://your-backend-api.com/protected-data"]];// [self sendAPIRequest:initialRequest];// 在 AttestCallbackDelegate 的 onSuccess 方法中重新发送请求#pragma mark - AttestCallbackDelegate- (void)onSuccess:(NSString *)token {NSLog(@"挑战成功,获取到新令牌: %@", token);// 重新发送原始请求,带上新令牌// 这里需要获取到之前的请求对象,并重新发送// 例如:// NSMutableURLRequest *retryRequest = [self.lastFailedRequest mutableCopy]; // 假设您保存了上次失败的请求// [retryRequest setValue:token forHTTPHeaderField:@"EO-Attest-Token"];// [self sendAPIRequest:retryRequest];}- (void)onError:(NSError *)error {NSLog(@"认证挑战失败: %@", error.localizedDescription);}
WKWebView 进行交互式认证(和 JS 认证)WKWebView (iOS 平台)是实现这些功能的关键组件。attestWithParams() 方法时提供一个 WKWebView 实例。这意味着开发者需在应用中预先分配 WKWebView 实例,并在调用认证 API 时将其作为参数传递给 SDK。WKWebView 实例来渲染其交互界面。该 WKWebView 实例将在应用内部显示验证码页面,因此需要预先设置以确保正确显示。WKWebView 实例作为 JavaScript 运行时环境,主要用于执行加密工作量证明 (PoW) 挑战。在此场景下,WKWebView 实例仅提供 JavaScript 执行沙箱,无需可见地渲染任何 UI。因此,传入的 WKWebView 实例无需可见,SDK 也不会将其用于 UI 渲染。文档反馈