Flutter云安全与服务管理插件cloudflare_turnstile的使用
Flutter云安全与服务管理插件cloudflare_turnstile的使用
Flutter Cloudflare Turnstile
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
更多关于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('欢迎来到主页!'),
),
);
}
}
注意
-
API密钥和区域ID:请确保你在代码中使用的API密钥和区域ID是正确的,并且这些密钥应该妥善保管,不要硬编码在客户端代码中。
-
错误处理:在生产环境中,应该添加更详细的错误处理和用户反馈机制。
-
安全性:不要在生产环境中使用明文密码,应该使用加密或哈希存储和传输密码。
这个示例只是一个基本的演示,实际项目中可能需要更多的配置和安全性措施。希望这个示例能帮助你理解如何在Flutter中使用cloudflare_turnstile插件。