Flutter谷歌验证码插件grecaptcha的使用
Flutter谷歌验证码插件grecaptcha的使用
简介
grecaptcha
是一个简单的 Flutter 插件,允许在 Android 设备上使用 SafetyNet API 验证用户是否为人类。
使用插件
准备工作
-
在
pubspec.yaml
文件中添加依赖:dependencies: grecaptcha: ^0.0.5
-
注册你的应用程序到 reCAPTCHA 管理控制台:
- 访问 reCAPTCHA Admin Console 并填写表单注册。
- 选择 “reCAPTCHA-Android” 类型。
- 复制你的 Android 包名(可以从
android/app/src/main/AndroidManifest.xml
中获取)并填入相应字段。
验证用户
在 Dart 代码中调用以下方法来验证用户是否为人类。确保替换 SITE_KEY
为你从 reCAPTCHA 管理界面获得的站点密钥。
Grecaptcha.verifyWithRecaptcha(SITE_KEY).then((result) {
// 发送结果令牌和表单字段到服务器进行进一步验证
}).onError((error, stackTrace) {
print("Could not verify:\n $error at $stackTrace");
});
服务器端验证
仅检查 Grecaptcha.verifyWithRecaptcha
是否返回值是不够的,必须在应用后端服务器上验证令牌。参考 Google reCAPTCHA 文档 进行服务器端验证。
示例 Demo
以下是完整的示例代码,展示了如何集成和使用 grecaptcha
插件。
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:grecaptcha/grecaptcha.dart';
void main() => runApp(const MyApp());
const String siteKey = "your_site_key"; // 替换为你的实际站点密钥
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
enum _VerificationStep { showingButton, working, error, verified }
class _MyAppState extends State<MyApp> {
_VerificationStep _step = _VerificationStep.showingButton;
void _startVerification() {
setState(() => _step = _VerificationStep.working);
Grecaptcha().verifyWithRecaptcha(siteKey).then((result) {
setState(() => _step = _VerificationStep.verified);
}).onError((error, stackTrace) {
if (kDebugMode) {
print("Could not verify:\n$error at $stackTrace");
}
setState(() => _step = _VerificationStep.error);
});
}
@override
Widget build(BuildContext context) {
Widget content;
switch (_step) {
case _VerificationStep.showingButton:
content = Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text("This example will use the reCaptcha API to verify that you're human"),
MaterialButton(
onPressed: _startVerification,
color: Colors.blueAccent,
textColor: Colors.white,
child: const Text("VERIFY"),
),
],
);
break;
case _VerificationStep.working:
content = Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: const [
CircularProgressIndicator(),
Text("Trying to figure out whether you're human"),
],
);
break;
case _VerificationStep.verified:
content = const Text("The reCaptcha API returned a token, indicating that you're a human.");
break;
case _VerificationStep.error:
content = const Text("We could not verify that you're a human :( This can occur if you "
"have no internet connection (or if you really are a bot).");
}
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('reCaptcha Example'),
),
body: Center(
child: content,
),
),
);
}
}
以上代码提供了一个完整的 Flutter 应用示例,展示如何使用 grecaptcha
插件进行用户验证,并根据验证结果更新 UI。请记得将 siteKey
替换为你自己的站点密钥,并确保在服务器端进行适当的令牌验证。
更多关于Flutter谷歌验证码插件grecaptcha的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter谷歌验证码插件grecaptcha的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter应用中集成谷歌验证码(通常指的是reCAPTCHA v2或v3,但请注意,直接在Flutter中使用grecaptcha库并不是很常见,因为grecaptcha主要设计用于网页环境。不过,我们可以通过Flutter的WebView插件或者调用原生平台代码来实现类似功能)。
以下是一个使用flutter_webview_plugin
来加载包含reCAPTCHA的网页,并处理验证码验证的示例。请注意,这种方法需要你有自己的后端服务器来处理reCAPTCHA的验证,因为reCAPTCHA的密钥和验证需要在服务器端完成。
步骤 1: 添加依赖
首先,在你的pubspec.yaml
文件中添加flutter_webview_plugin
依赖:
dependencies:
flutter:
sdk: flutter
flutter_webview_plugin: ^0.4.0 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
步骤 2: 配置reCAPTCHA
- 在Google reCAPTCHA管理控制台创建一个站点并获取你的站点密钥(site key)和秘密密钥(secret key)。
步骤 3: 使用WebView加载reCAPTCHA页面
下面是一个基本的Flutter应用示例,它使用WebView来加载一个包含reCAPTCHA的网页。你需要一个HTML页面,该页面包含reCAPTCHA小部件,并将其托管在你可以访问的服务器上。
import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: WebviewScaffold(
url: 'https://your-server.com/recaptcha-page.html', // 替换为你的HTML页面URL
appBar: AppBar(
title: Text('reCAPTCHA Example'),
),
withJavascript: true,
withLocalStorage: true,
hidden: true,
clearCookies: false,
clearCache: false,
javascriptMode: JavascriptMode.UNRESTRICTED,
onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
// 你可以在这里添加更多的WebView控制逻辑
},
onUrlChanged: (String url) {
print("URL changed to $url");
// 你可以在这里检查URL变化来处理回调
},
),
);
}
WebViewController _controller;
}
步骤 4: 在HTML页面中集成reCAPTCHA
创建一个HTML页面(例如recaptcha-page.html
),并添加以下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>reCAPTCHA Example</title>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
<h1>Please complete the reCAPTCHA</h1>
<form id="recaptcha-form" action="YOUR_SERVER_VERIFY_ENDPOINT" method="POST">
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
<br/>
<input type="submit" value="Submit">
</form>
<script>
document.getElementById('recaptcha-form').onsubmit = function(event) {
event.preventDefault();
grecaptcha.ready(function() {
grecaptcha.execute('YOUR_SITE_KEY', {action: 'submit'}).then(function(token) {
// 在这里,你可以通过Flutter的通道将token发送到Dart代码,或者直接通过AJAX发送到你的服务器进行验证
var formData = new FormData();
formData.append('g-recaptcha-response', token);
fetch('YOUR_SERVER_VERIFY_ENDPOINT', {
method: 'POST',
body: formData,
}).then(response => response.json())
.then(data => {
if (data.success) {
alert('Verification successful!');
// 根据需要处理成功逻辑
} else {
alert('Verification failed!');
// 根据需要处理失败逻辑
}
});
});
});
};
</script>
</body>
</html>
请确保将YOUR_SERVER_VERIFY_ENDPOINT
替换为你的后端验证端点,并将YOUR_SITE_KEY
替换为你的reCAPTCHA站点密钥。
注意事项
- 安全性:直接在客户端处理敏感信息(如reCAPTCHA响应)是不安全的。你应该在服务器端验证reCAPTCHA响应。
- Flutter与原生交互:如果你需要在Flutter和原生代码之间传递数据(例如,将reCAPTCHA响应从WebView传递到Dart代码),你可以使用MethodChannel或BasicMessageChannel。
- 用户体验:WebView可能会降低用户体验,特别是在移动设备上。考虑使用原生解决方案或更现代的验证方法。
这种方法是一个基本的示例,用于说明如何在Flutter应用中集成reCAPTCHA。根据你的具体需求,你可能需要调整代码和流程。