Flutter企业级验证码验证插件recaptcha_enterprise_flutter的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter企业级验证码验证插件recaptcha_enterprise_flutter的使用

reCAPTCHA Enterprise Flutter Module

请注意,本仓库中提交的问题并不是官方的Google支持渠道,而是尽力而为地提供帮助。对于官方支持,请访问: https://cloud.google.com/support-hub

如果您有关于Flutter插件的问题,请在此仓库中提交问题。如果您遇到的是底层SDK的问题,请在https://github.com/GoogleCloudPlatform/recaptcha-enterprise-mobile-sdk提交问题。

关于reCAPTCHA Enterprise在移动应用中的通用文档,请参阅:

示例App

要运行示例应用程序,请执行以下步骤:

  1. 配置文件:将example/assets/configs/dev.json.example复制到example/assets/configs/dev.json,并添加您的sitekeys到该文件。
  2. 更改iOS包名:在example/ios/Runner.xcodeproj/project.pbxproj文件中,将三个地方的iOS包名从google.FlutterTestApp更改为您自己的包名。
  3. 更改Android包名:在example/android/app/build.gradle文件中,将Android包名从google.FlutterTestApp更改为您自己的包名。
  4. 启动模拟器:例如,您可以使用命令open -a Simulator~/Library/Android/sdk/emulator/emulator -avd Pixel_4_API_32来启动模拟器。

运行应用

cd example && flutter run

运行单元测试

flutter test

运行集成测试

cd example && flutter test integration_test/app_test.dart

示例代码

以下是main.dart的完整示例代码,展示了如何使用recaptcha_enterprise_flutter插件进行reCAPTCHA验证。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:recaptcha_enterprise_flutter/recaptcha.dart';
import 'package:recaptcha_enterprise_flutter/recaptcha_client.dart';
import 'package:recaptcha_enterprise_flutter/recaptcha_enterprise.dart';
import 'package:recaptcha_enterprise_flutter/recaptcha_action.dart';
import 'dart:io' show Platform;
import 'package:recaptcha_flutter_example/app_config.dart';

void main({String? env}) async {
  WidgetsFlutterBinding.ensureInitialized();
  final config = await AppConfig.forEnvironment(env);
  runApp(MyApp(config: config));
}

class MyApp extends StatefulWidget {
  final AppConfig config;

  const MyApp({required this.config, super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _clientState = "NOT INITIALIZED";
  String _token = "NO TOKEN";
  RecaptchaClient? _client;

  void initClient() async {
    var result = false;
    var errorMessage = "failure";

    var siteKey = _getSiteKey();

    try {
      result = await RecaptchaEnterprise.initClient(siteKey, timeout: 10000);
    } on PlatformException catch (err) {
      debugPrint('Caught platform exception on init: $err');
      errorMessage = 'Code: ${err.code} Message ${err.message}';
    } catch (err) {
      debugPrint('Caught exception on init: $err');
      errorMessage = err.toString();
    }

    setState(() {
      _clientState = result ? "ok" : errorMessage;
    });
  }

  String _getSiteKey() {
    return Platform.isAndroid
        ? widget.config.androidSiteKey
        : widget.config.iosSiteKey;
  }

  void fetchClient() async {
    var errorMessage = "failure";
    var result = false;

    var siteKey = _getSiteKey();

    try {
      _client = await Recaptcha.fetchClient(siteKey);
      result = true;
    } on PlatformException catch (err) {
      debugPrint('Caught platform exception on init: $err');
      errorMessage = 'Code: ${err.code} Message ${err.message}';
    } catch (err) {
      debugPrint('Caught exception on init: $err');
      errorMessage = err.toString();
    }

    setState(() {
      _clientState = result ? "ok" : errorMessage;
    });
  }

  void executeWithFetchClient() async {
    String result;

    try {
      result = await _client?.execute(RecaptchaAction.LOGIN()) ??
          "Client not initialized yet, click button InitClient";
    } on PlatformException catch (err) {
      debugPrint('Caught platform exception on execute: $err');
      result = 'Code: ${err.code} Message ${err.message}';
    } catch (err) {
      debugPrint('Caught exception on execute: $err');
      result = err.toString();
    }

    setState(() {
      _token = result;
    });
  }

  void execute({custom = false}) async {
    String result;

    try {
      result = custom
          ? await RecaptchaEnterprise.execute(RecaptchaAction.custom('foo'),
              timeout: 10000)
          : await RecaptchaEnterprise.execute(RecaptchaAction.LOGIN());
    } on PlatformException catch (err) {
      debugPrint('Caught platform exception on execute: $err');
      result = 'Code: ${err.code} Message ${err.message}';
    } catch (err) {
      debugPrint('Caught exception on execute: $err');
      result = err.toString();
    }

    setState(() {
      _token = result;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(
        title: const Text('reCAPTCHA Example'),
      ),
      body: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
        Row(mainAxisAlignment: MainAxisAlignment.center, children: [
          Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
            const Text('reCAPTCHA Client:\n '),
            Text(_clientState, key: const Key('clientState')),
          ]),
        ]),
        Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
          const Text('reCAPTCHA Token:\n '),
          SizedBox(
            width: 300,
            child: Text(_token,
                textAlign: TextAlign.center,
                overflow: TextOverflow.ellipsis,
                maxLines: 12,
                key: const Key('token')),
          ),
        ]),
        Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
          TextButton(
            onPressed: () {
              initClient();
            },
            key: const Key('getClient'),
            child: Container(
              color: Colors.green,
              padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5),
              child: const Text(
                'GetClient',
                style: TextStyle(color: Colors.white, fontSize: 13.0),
              ),
            ),
          ),
          TextButton(
            onPressed: () {
              execute();
            },
            key: const Key('executeButton'),
            child: Container(
              color: Colors.green,
              padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5),
              child: const Text(
                'ExecuteGet',
                style: TextStyle(color: Colors.white, fontSize: 13.0),
              ),
            ),
          ),
          TextButton(
            onPressed: () {
              execute(custom: true);
            },
            key: const Key('executeButtonCustom'),
            child: Container(
              color: Colors.green,
              padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5),
              child: const Text(
                'ExecuteGetCustom',
                style: TextStyle(color: Colors.white, fontSize: 13.0),
              ),
            ),
          ),
        ]),
        Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
          TextButton(
              onPressed: () {
                fetchClient();
              },
              key: const Key('fetchClient'),
              child: Container(
                color: Colors.lightBlue,
                padding:
                    const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
                child: const Text(
                  'FetchClient',
                  style: TextStyle(color: Colors.white, fontSize: 13.0),
                ),
              )),
          TextButton(
            onPressed: () {
              executeWithFetchClient();
            },
            key: const Key('executeFetchButton'),
            child: Container(
              color: Colors.lightBlue,
              padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
              child: const Text(
                'ExecuteFetch',
                style: TextStyle(color: Colors.white, fontSize: 13.0),
              ),
            ),
          ),
        ]),
      ]),
    ));
  }
}

此代码展示了如何初始化和使用reCAPTCHA Enterprise客户端,并获取验证令牌。通过点击按钮,用户可以触发不同的reCAPTCHA操作,如初始化客户端、获取客户端、执行标准操作或自定义操作。每个操作的结果都会显示在界面上,以便用户查看验证状态和生成的令牌。

希望这个示例能帮助您更好地理解和使用recaptcha_enterprise_flutter插件。如果有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter企业级验证码验证插件recaptcha_enterprise_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter企业级验证码验证插件recaptcha_enterprise_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用recaptcha_enterprise_flutter插件进行企业级验证码验证的示例代码。请注意,由于recaptcha_enterprise_flutter插件并非一个广泛认知的标准Flutter插件(Flutter的官方插件库中并没有这个插件),我假设你指的是一个自定义的或者第三方实现的插件。通常,这样的插件会提供一些API来进行验证码的展示和验证。

首先,你需要确保你的pubspec.yaml文件中已经包含了该插件的依赖项(假设插件名为recaptcha_enterprise_flutter):

dependencies:
  flutter:
    sdk: flutter
  recaptcha_enterprise_flutter: ^x.y.z  # 请替换为实际的版本号

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

接下来,在你的Flutter项目中,你可以按照以下方式使用recaptcha_enterprise_flutter插件:

  1. 导入插件
import 'package:recaptcha_enterprise_flutter/recaptcha_enterprise_flutter.dart';
  1. 初始化插件并展示验证码

通常,企业级的验证码验证会涉及到与后端服务器的交互,以获取验证码的配置和验证结果。这里假设插件提供了相关的方法来展示验证码和验证用户输入。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Recaptcha Enterprise Example'),
        ),
        body: Center(
          child: RecaptchaEnterpriseWidget(
            siteKey: 'your-site-key',  // 从Google reCAPTCHA Enterprise获取
            onLoad: () {
              print('recaptcha widget loaded');
            },
            onVerify: (String token) {
              print('recaptcha token: $token');
              // 将token发送到你的后端服务器进行验证
              verifyToken(token);
            },
            onError: (String errorMessage) {
              print('recaptcha error: $errorMessage');
            },
          ),
        ),
      ),
    );
  }

  void verifyToken(String token) async {
    // 发送token到你的后端服务器进行验证
    String backendUrl = 'https://your-backend-server.com/verify-recaptcha';
    Map<String, String> body = {'token': token};

    final response = await http.post(Uri.parse(backendUrl),
        body: bodyEncoding.encodeToString(body),
        headers: {
          'Content-Type': 'application/json',
        });

    if (response.statusCode == 200) {
      print('Captcha verified successfully');
      // 处理验证成功的逻辑
    } else {
      print('Captcha verification failed');
      // 处理验证失败的逻辑
    }
  }
}

请注意,上面的代码示例中有几个关键点需要注意:

  • RecaptchaEnterpriseWidget是一个假设的widget,用于展示和处理验证码。实际插件可能提供了不同的API或组件。
  • siteKey是你从Google reCAPTCHA Enterprise服务中获取的站点密钥。
  • verifyToken函数是一个示例,展示了如何将用户提交的验证码token发送到你的后端服务器进行验证。你需要替换backendUrl为你的后端验证端点。
  • 实际的HTTP请求部分(http.post)需要引入dart:iopackage:http/http.dart等库。这里假设你已经有了相应的HTTP请求处理逻辑。

由于recaptcha_enterprise_flutter不是官方或广泛认知的插件,因此上述代码需要根据实际插件的API进行调整。如果插件提供了不同的方法或组件,请查阅其官方文档或源代码以获取正确的使用方式。

回到顶部