Flutter云安全与服务管理插件cloudflare_turnstile的使用

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

Flutter云安全与服务管理插件cloudflare_turnstile的使用

Flutter Cloudflare Turnstile Pub

Cloudflare Turnstile 是一个免费的 CAPTCHA 替代方案,它为网站访客提供无挫感、无 CAPTCHA 的网页体验 - 只需简单的一段免费代码。此外,Turnstile 可以阻止滥用行为并确认访问者的真实性,而不会产生数据隐私问题或糟糕的用户体验。

⚠️ 请注意,此软件包是非官方的,并未得到 Cloudflare 的认可。请自行决定是否使用。

安装

在您的 Flutter 项目中添加 cloudflare_turnstile 插件:

flutter pub add cloudflare_turnstile

示例

下面是一个快速示例,展示了如何将 Cloudflare Turnstile 小部件添加到您的 Flutter 应用程序中:

基本示例

import 'package:flutter/material.dart';
import 'package:cloudflare_turnstile/cloudflare_turnstile.dart';

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // Turnstile widget configuration
    final TurnstileOptions options = const TurnstileOptions(
      size: TurnstileSize.normal,
      theme: TurnstileTheme.light,
      language: 'ar',
      retryAutomatically: false,
      refreshTimeout: TurnstileRefreshTimeout.manual,
    );

    return Scaffold(
      body: Center(
        child: CloudflareTurnstile(
          siteKey: '3x00000000000000000000FF', //Change with your site key
          baseUrl: 'http://localhost/',
          onTokenReceived: (token) {
            print(token);
          },
        ),
      ),
    );
  }
}

对于 Android 和 iOS 平台,您需要提供 baseUrl 参数,该参数必须与创建小部件时的域名列表中的 URL 相同。

使用 Turnstile 隐藏模式

以下是如何使用 Cloudflare 的隐藏 Turnstile 模式,在后台自动解决挑战:

import 'package:cloudflare_turnstile/cloudflare_turnstile.dart';

class TurnstileService {
  /// 获取 CloudFlare Turnstile token 使用隐藏模式。
  static Future<String?> get token async {
    // 初始化一个隐藏模式的 Cloudflare Turnstile 实例,使用您的站点密钥
    final turnstile = CloudflareTurnstile.invisible(
      siteKey: '1x00000000000000000000BB', // 替换为您的实际站点密钥
    );

    try {
      // 获取 Turnstile token
      final token = await turnstile.getToken();
      return token; // 成功时返回 token
    } on TurnstileException catch (e) {
      // 处理 Turnstile 失败
      print('Challenge failed: ${e.message}');
    } finally {
      // 确保正确释放 Turnstile 实例
      turnstile.dispose();
    }

    // 如果无法生成 token,则返回 null
    return null;
  }
}

⚠️ 重要提示:当不再需要时,请务必调用 dispose() 方法来释放 CloudflareTurnstile 实例。这可以确保资源被正确清理,防止潜在的内存问题。

完整示例代码

以下是一个完整的示例代码,包含刷新和验证 token 的功能:

import 'package:flutter/material.dart';
import 'package:cloudflare_turnstile/cloudflare_turnstile.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  final TurnstileController _controller = TurnstileController();
  final TurnstileOptions _options = TurnstileOptions(
    size: TurnstileSize.normal,
    theme: TurnstileTheme.light,
    refreshExpired: TurnstileRefreshExpired.manual,
    language: 'en',
    retryAutomatically: false,
  );

  String? _token;

  @override
  void dispose() {
    super.dispose();
    _controller.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Builder(
        builder: (context) => Scaffold(
          body: Center(
            child: SingleChildScrollView(
              padding: const EdgeInsets.all(16.0),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  ConstrainedBox(
                    constraints: const BoxConstraints(maxWidth: 700),
                    child: _token != null
                        ? SelectableText(_token!)
                        : const CircularProgressIndicator(),
                  ),
                  const SizedBox(height: 48.0),
                  Align(
                    alignment: Alignment.center,
                    child: CloudflareTurnstile(
                      siteKey: '3x00000000000000000000FF',
                      options: _options,
                      controller: _controller,
                      onTokenReceived: (token) {
                        setState(() {
                          _token = token;
                        });
                      },
                      onTokenExpired: () {},
                      onError: (error) {
                        ScaffoldMessenger.of(context).showSnackBar(
                          SnackBar(
                            content: Text(
                                'Turnstile challenge failed:\n${error.message}'),
                          ),
                        );
                      },
                    ),
                  ),
                  const SizedBox(height: 48.0),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      ElevatedButton(
                        onPressed: () async {
                          setState(() {
                            _token = null;
                          });

                          await _controller.refreshToken();
                        },
                        child: const Text('Refresh Token'),
                      ),
                      const SizedBox(width: 16.0),
                      ElevatedButton(
                        onPressed: () {
                          _controller.isExpired().then((isExpired) {
                            ScaffoldMessenger.of(context).showSnackBar(
                              SnackBar(
                                content: Text(
                                    'Token is ${isExpired ? "Expired" : "Valid"}'),
                              ),
                            );
                          });
                        },
                        child: const Text('Validate Token'),
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

这个完整的示例展示了如何在应用程序中集成 Cloudflare Turnstile,并提供了刷新和验证 token 的按钮。希望这些信息对您有帮助!如果有任何问题或建议,请随时提问。


更多关于Flutter云安全与服务管理插件cloudflare_turnstile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter云安全与服务管理插件cloudflare_turnstile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中cloudflare_turnstile插件的使用,这是一个用于云安全和服务管理的强大工具。下面是一个基本的代码案例,展示了如何在Flutter项目中集成和使用cloudflare_turnstile插件。

首先,确保你已经在Flutter项目的pubspec.yaml文件中添加了cloudflare_turnstile的依赖:

dependencies:
  flutter:
    sdk: flutter
  cloudflare_turnstile: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤配置和使用cloudflare_turnstile插件。

1. 初始化cloudflare_turnstile

在你的Flutter应用的入口文件(通常是main.dart)中,初始化cloudflare_turnstile。

import 'package:flutter/material.dart';
import 'package:cloudflare_turnstile/cloudflare_turnstile.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化Cloudflare Turnstile
    CloudflareTurnstile.instance.init(
      apiKey: '你的Cloudflare API密钥',  // 替换为你的Cloudflare API密钥
      zoneId: '你的Cloudflare区域ID',    // 替换为你的Cloudflare区域ID
      secretKey: '你的Cloudflare密钥',   // 可选,如果你的配置需要
    );

    return MaterialApp(
      title: 'Flutter Cloudflare Turnstile Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

2. 使用Cloudflare Turnstile进行用户验证

假设你有一个登录页面,当用户登录时,你可以使用Cloudflare Turnstile来验证用户的身份。

import 'package:flutter/material.dart';
import 'package:cloudflare_turnstile/cloudflare_turnstile.dart';

class LoginPage extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final _formKey = GlobalKey<FormState>();
  String _email = '';
  String _password = '';

  void _submit() {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();

      // 使用Cloudflare Turnstile进行用户验证
      CloudflareTurnstile.instance.verifyUser(
        email: _email,
        password: _password,
      ).then((result) {
        if (result.success) {
          // 验证成功,处理登录逻辑
          Navigator.of(context).pushReplacement(
            MaterialPageRoute(builder: (context) => HomePage()),
          );
        } else {
          // 验证失败,显示错误信息
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('登录失败: ${result.message}')),
          );
        }
      }).catchError((error) {
        // 处理错误
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('发生错误: $error')),
        );
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('登录'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return '请输入Email';
                  }
                  return null;
                },
                onSaved: (value) {
                  _email = value!;
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return '请输入密码';
                  }
                  return null;
                },
                onSaved: (value) {
                  _password = value!;
                },
              ),
              Padding(
                padding: const EdgeInsets.symmetric(vertical: 16.0),
                child: ElevatedButton(
                  onPressed: _submit,
                  child: Text('登录'),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

3. 处理登录后的主页

当用户成功登录后,你可以导航到一个新的页面,比如主页。

import 'package:flutter/material.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('主页'),
      ),
      body: Center(
        child: Text('欢迎来到主页!'),
      ),
    );
  }
}

注意

  1. API密钥和区域ID:请确保你在代码中使用的API密钥和区域ID是正确的,并且这些密钥应该妥善保管,不要硬编码在客户端代码中。

  2. 错误处理:在生产环境中,应该添加更详细的错误处理和用户反馈机制。

  3. 安全性:不要在生产环境中使用明文密码,应该使用加密或哈希存储和传输密码。

这个示例只是一个基本的演示,实际项目中可能需要更多的配置和安全性措施。希望这个示例能帮助你理解如何在Flutter中使用cloudflare_turnstile插件。

回到顶部