Flutter数据安全与保护插件data_dome_plugin的使用

插件说明

Flutter有自己的网络实现方式,但此插件分别使用了iOS上的URLSession和Android上的OkHttp。

注意事项

如果您的项目不支持Swift/Kotlin,请查看这里

iOS配置

  1. ../ios/Runner/Info.plist文件中添加键值对DataDomeKey,其值为您的DataDome密钥字符串。
  2. 同样在../ios/Runner/Info.plist文件中添加键值对DataDomeProxyEnabled,其值为布尔值NO

对于强制显示iOS上的验证码,请参考DataDome iOS SDK文档

Android配置

方法调用有一个用于传递DataDome密钥的关键参数。

对于强制显示Android上的验证码,请参考DataDome Android SDK文档,但可能无法正常工作。

使用示例

以下是一个完整的示例代码,展示如何使用data_dome_plugin插件进行HTTP请求。

try {
  // 设置请求头
  final headers = {
    'Content-type': 'application/json',
    'Accept': 'application/json',
  };

  // TODO: 填写URL和Android上的DataDome密钥
  final key = ''; // 替换为您的DataDome密钥
  final url = ''; // 替换为您要访问的URL

  // 准备JSON请求体
  final json = {
    "any": "body",
    "some": 1,
    "is": true,
  };
  final body = Uint8List.fromList(utf8.encode(jsonEncode(json)));

  // 调用DataDome插件发送POST请求
  final result = await DataDomePlugin.httpCall(
    HttpMethod.post, // 使用POST方法
    url,
    headers,
    body,
    key,
  );

  // 将结果转换为HTTP响应
  final response = _makeResponse(result);

  // 打印HTTP状态码
  print(response.statusCode.toString());
} on PlatformException {
  print('Failed HTTP call');
}

// 辅助函数:将插件返回的结果转换为HTTP响应对象
http.Response _makeResponse(Map<String, dynamic> resp) {
  final int code = resp['code'] ?? 500; // 提取状态码,默认为500
  final Uint8List data = resp['data'] ?? Uint8List(0); // 提取响应数据,默认为空字节列表
  return http.Response.bytes(
    data.toList(), // 将Uint8List转换为普通List
    code,
    headers: {'content-type': 'application/json; charset=utf-8'}, // 设置响应头
  );
}

完整示例代码

以下是从官方示例代码中提取并简化后的完整代码:

import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';

import 'package:data_dome_plugin/data_dome_plugin.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('DataDome Plugin Example'),
        ),
        body: Center(
          child: Text('Running on: $_platformVersion\n'),
        ),
      ),
    );
  }

  // 初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;

    try {
      // 配置GET请求
      final headers = {
        'Content-type': 'application/json',
        'Accept': 'application/json',
      };
      final key = ''; // 替换为您的DataDome密钥
      final url = ''; // 替换为您要访问的URL
      final body = null;

      final result = await DataDomePlugin.httpCall(
        HttpMethod.get,
        url,
        headers,
        body,
        key,
      );
      final response = _makeResponse(result);
      platformVersion = response.statusCode.toString();
    } on PlatformException {
      platformVersion = 'Failed HTTP call';
    }

    try {
      // 配置POST请求
      final headers = {
        'Content-type': 'application/json',
        'Accept': 'application/json',
      };
      final key = ''; // 替换为您的DataDome密钥
      final url = ''; // 替换为您要访问的URL
      final json = {
        "any": "body",
        "some": 1,
        "is": true,
      };
      final body = Uint8List.fromList(utf8.encode(jsonEncode(json)));

      final result = await DataDomePlugin.httpCall(
        HttpMethod.post,
        url,
        headers,
        body,
        key,
      );
      final response = _makeResponse(result);
      platformVersion = response.statusCode.toString();
    } on PlatformException {
      platformVersion = 'Failed HTTP call';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 将插件返回的结果转换为HTTP响应对象
  http.Response _makeResponse(Map<String, dynamic> resp) {
    final int code = resp['code'] ?? 500;
    final Uint8List data = resp['data'] ?? Uint8List(0);
    return http.Response.bytes(
      data.toList(),
      code,
      headers: {'content-type': 'application/json; charset=utf-8'},
    );
  }
}

更多关于Flutter数据安全与保护插件data_dome_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据安全与保护插件data_dome_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


data_dome_plugin 是一个用于 Flutter 的插件,旨在帮助开发者集成 DataDome 的防护功能,以保护应用程序免受恶意流量、爬虫和其他自动化攻击的侵害。DataDome 是一个实时反欺诈和反爬虫解决方案,能够有效保护你的应用程序和 API。

安装 data_dome_plugin

首先,你需要在 pubspec.yaml 文件中添加 data_dome_plugin 依赖:

dependencies:
  flutter:
    sdk: flutter
  data_dome_plugin: ^1.0.0  # 请使用最新版本

然后,运行 flutter pub get 来安装依赖。

配置 data_dome_plugin

在使用 data_dome_plugin 之前,你需要在 DataDome 控制台中获取你的 API KeyEndpoint

1. 初始化插件

在你的 Flutter 应用程序的 main.dart 文件中,初始化 data_dome_plugin

import 'package:data_dome_plugin/data_dome_plugin.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 DataDome 插件
  await DataDomePlugin.initialize(
    apiKey: 'YOUR_API_KEY',
    endpoint: 'YOUR_ENDPOINT',
  );

  runApp(MyApp());
}

2. 处理请求

data_dome_plugin 会自动拦截所有的网络请求,并对其进行保护。你不需要手动处理每个请求,插件会自动将请求发送到 DataDome 进行验证。

3. 处理验证结果

你可以通过监听 DataDomePlugin 的事件来处理验证结果。例如,如果请求被阻止,你可以显示一个错误页面或提示用户重新尝试。

DataDomePlugin.onBlocked.listen((event) {
  // 处理被阻止的请求
  print('Request blocked: ${event.url}');
});

DataDomePlugin.onAllowed.listen((event) {
  // 处理允许的请求
  print('Request allowed: ${event.url}');
});

高级配置

data_dome_plugin 还提供了一些高级配置选项,例如设置自定义的 User-Agent、启用或禁用某些功能等。

await DataDomePlugin.initialize(
  apiKey: 'YOUR_API_KEY',
  endpoint: 'YOUR_ENDPOINT',
  userAgent: 'MyCustomUserAgent',
  enableDebugLogs: true,  // 启用调试日志
);

处理错误

在使用 data_dome_plugin 时,可能会遇到一些错误,例如网络问题或配置错误。你可以通过捕获异常来处理这些错误:

try {
  await DataDomePlugin.initialize(
    apiKey: 'YOUR_API_KEY',
    endpoint: 'YOUR_ENDPOINT',
  );
} catch (e) {
  print('Failed to initialize DataDome: $e');
}
回到顶部