Flutter Firebase reCAPTCHA验证插件flutter_firebase_recaptcha的使用

Flutter Firebase reCAPTCHA验证插件flutter_firebase_recaptcha的使用

flutter_firebase_recaptcha 提供了一组构建块来创建一个 reCAPTCHA 验证器,并将其与您的 Firebase 电话认证工作流一起使用。

Firebase 电话认证无法直接使用 Firebase JS SDK 完成。这是因为需要一个应用程序验证对象(reCAPTCHA)作为额外的安全措施,以验证用户是否真实而不是机器人。

安装

pubspec.yaml 文件中添加包

flutter pub add flutter_firebase_recaptcha

基本用法

为了开始,请阅读官方的 Firebase 电话认证指南并忽略所有涉及 reCAPTCHA 配置的步骤。

我们将使用自己的验证器,该验证器会在网页浏览器内创建一个 reCAPTCHA 小部件。

FirebaseRecaptchaVerifierModal 小部件添加到您的应用中,并通过 firebaseConfig 属性传递 Firebase 网页配置。

注意:您可以选择性地使用 attemptInvisibleVerification 属性打开实验性的隐形 reCAPTCHA。此功能尝试在不向用户显示任何界面的情况下完成验证过程。当隐形验证失败时,将显示完整的 reCAPTCHA 挑战界面。

const firebaseConfig = {
    'apiKey': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'authDomain': 'XXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'projectId': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'storageBucket': 'XXXXXXXXXXXXXXXXXXXXXXXX',
    'messagingSenderId': 'XXXXXXXXXXXXXXXXXXXX',
    'appId': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
};

FirebaseRecaptchaVerifierModal(
      firebaseConfig: firebaseConfig,
      onVerify: (token) => print('token: ' + token),
      onLoad: () => print('onLoad'),
      onError: () => print('onError'),
      onFullChallenge: () => print('onFullChallenge'),
      attemptInvisibleVerification: true,
    );

API

import 'package:flutter_firebase_recaptcha/flutter_firebase_recaptcha.dart';

<code>FirebaseRecaptchaVerifierModal</code>

自动显示的模态屏幕,显示一个 reCAPTCHA 小部件。

Props
  • firebaseConfig (IFirebaseOptions) – Firebase 网页配置。
  • firebaseVersion (string) – 加载在 web-view 中的 Firebase JavaScript SDK 的可选版本。例如 version="7.9.0"
  • attemptInvisibleVerification (boolean) – 尝试在不显示 reCAPTCHA 工作流程的情况下进行验证。默认为 false。(应用 Google 条款 - 使用 FirebaseRecaptchaBanner 显示 Google 条款和政策)。
  • appVerificationDisabledForTesting (boolean) – 设置时,禁用应用验证以测试电话认证。当此属性为 true 时,渲染模拟 reCAPTCHA。这在开发期间的手动测试或自动化集成测试中很有用。更多信息请参见 Firebase 电话认证
  • languageCode (string) – 显示 reCAPTCHA 挑战的语言。可能的语言列表,请参见 reCAPTCHA 语言代码

<code>FirebaseRecaptcha</code>

在 web-view 中显示的 reCAPTCHA v3 小部件。

Props
  • firebaseConfig (Map<String, String>) – Firebase 网页配置。
  • firebaseVersion (string) – 加载在 web-view 中的 Firebase JavaScript SDK 的可选版本。例如 firebaseVersion: '7.9.0'
  • appVerificationDisabledForTesting (boolean) – 设置时,禁用应用验证以测试电话认证。当此属性为 true 时,渲染模拟 reCAPTCHA。这在开发期间的手动测试或自动化集成测试中很有用。更多信息请参见 Firebase 电话认证
  • languageCode (string) – 显示 reCAPTCHA 挑战的语言。可能的语言列表,请参见 reCAPTCHA 语言代码
  • onLoad (function) – 当小部件加载时调用的回调。
  • onError (function) – 当小部件加载失败时调用的回调。
  • onVerify (function) – 当 reCAPTCHA 验证用户不是机器人时调用的回调。回调提供了 reCAPTCHA 令牌字符串。示例 onVerify: (token) => setState(() { _token = token; })
  • onFullChallenge (function) – 当 reCAPTCHA 显示完整的挑战体验时调用的回调。
  • invisible (boolean) – 当为 true 时,渲染一个 invisible reCAPTCHA 小部件。可以通过设置 verify 属性为 true 来触发隐形验证。

完整示例 Demo

下面是一个完整的示例,展示了如何在 Flutter 应用程序中使用 flutter_firebase_recaptcha 插件:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  final firebaseConfig = {
    'apiKey': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'authDomain': 'XXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'projectId': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'storageBucket': 'XXXXXXXXXXXXXXXXXXXXXXXX',
    'messagingSenderId': 'XXXXXXXXXXXXXXXXXXXX',
    'appId': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
  };

  void _handleOnVerify(String token) {
    print('Token: $token');
  }

  void _handleOnLoad() {
    print('Widget loaded');
  }

  void _handleOnError() {
    print('Widget error');
  }

  void _handleOnFullChallenge() {
    print('Full challenge');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Firebase reCAPTCHA Example'),
      ),
      body: Center(
        child: FirebaseRecaptchaVerifierModal(
          firebaseConfig: firebaseConfig,
          onVerify: _handleOnVerify,
          onLoad: _handleOnLoad,
          onError: _handleOnError,
          onFullChallenge: _handleOnFullChallenge,
          attemptInvisibleVerification: true,
        ),
      ),
    );
  }
}

更多关于Flutter Firebase reCAPTCHA验证插件flutter_firebase_recaptcha的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


flutter_firebase_recaptcha 是一个用于在 Flutter 应用中集成 Firebase reCAPTCHA 的插件。它主要用于处理需要通过 reCAPTCHA 验证的场景,例如手机号验证登录。以下是如何使用 flutter_firebase_recaptcha 插件的详细步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_firebase_recaptcha 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_firebase_recaptcha: ^1.0.0

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

2. 配置 Firebase

确保你已经在 Firebase 控制台中创建了项目,并且已经按照 Firebase 的官方文档在 Flutter 应用中配置了 Firebase。这包括将 google-services.json(Android)或 GoogleService-Info.plist(iOS)文件添加到你的项目中。

3. 初始化 Firebase

main.dart 中初始化 Firebase:

import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

4. 使用 flutter_firebase_recaptcha 进行验证

在你的应用中,你可以使用 FlutterFirebaseRecaptcha 组件来处理 reCAPTCHA 验证。以下是一个简单的示例,展示如何使用该插件进行手机号验证登录。

import 'package:flutter/material.dart';
import 'package:flutter_firebase_recaptcha/flutter_firebase_recaptcha.dart';
import 'package:firebase_auth/firebase_auth.dart';

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

class _RecaptchaScreenState extends State<RecaptchaScreen> {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  String _verificationId;

  Future<void> _verifyPhoneNumber() async {
    await _auth.verifyPhoneNumber(
      phoneNumber: '+1234567890',
      verificationCompleted: (PhoneAuthCredential credential) async {
        // 自动验证完成
        await _auth.signInWithCredential(credential);
      },
      verificationFailed: (FirebaseAuthException e) {
        // 验证失败
        print('Verification failed: ${e.message}');
      },
      codeSent: (String verificationId, int resendToken) {
        // 验证码已发送,保存 verificationId
        setState(() {
          _verificationId = verificationId;
        });
      },
      codeAutoRetrievalTimeout: (String verificationId) {
        // 自动获取验证码超时
      },
      timeout: Duration(seconds: 60),
    );
  }

  Future<void> _signInWithPhoneNumber(String smsCode) async {
    try {
      final AuthCredential credential = PhoneAuthProvider.credential(
        verificationId: _verificationId,
        smsCode: smsCode,
      );
      await _auth.signInWithCredential(credential);
      print('User signed in successfully');
    } catch (e) {
      print('Error signing in: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('reCAPTCHA Verification')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: _verifyPhoneNumber,
              child: Text('Verify Phone Number'),
            ),
            if (_verificationId != null)
              FlutterFirebaseRecaptcha(
                onVerified: (String token) async {
                  // 在这里处理验证成功的逻辑,例如发送短信验证码
                  String smsCode = '123456'; // 这里需要从用户输入获取
                  await _signInWithPhoneNumber(smsCode);
                },
                onError: (FirebaseAuthException error) {
                  print('reCAPTCHA error: ${error.message}');
                },
              ),
          ],
        ),
      ),
    );
  }
}
回到顶部