Flutter多因素认证插件firebase_multi_factor_auth的使用

Flutter多因素认证插件firebase_multi_factor_auth的使用

目录

概述 #

此库为您的Flutter应用程序启用了Firebase多因素认证。 第一个实现的方法是Google登录。第二种方法是电话号码登录。

如果您使用Google邮箱进行登录,并且使用两个不同的电话号码进行MFA,则会创建两个帐户。 不会检查您的电话号码是否已被其他帐户使用。

一个带有Android和Web实例的示例项目位于example/目录下。 其他平台尚未实现或测试。 但您可以添加它!它是开源的。

您无需使用提供的小部件。 您可以直接使用函数、小部件和功能。

免责声明 #

Firebase多因素认证无信用卡的测试用途? 当然!

这是一个概念验证(POC)。

此库与Firebase或Google无关。

这仅适用于您没有信用卡并想测试Firebase多因素认证时的测试用途。

通常,您不必为一定数量的MFA请求付费。仅在此数量内允许使用此库。 对于可能发生的任何损害或利润损失,您应承担责任。

设置 #

1. 添加插件 #
flutter pub add firebase_multi_factor_auth
2. Firebase初始化 #

您可以参考以下指南:将Firebase添加到您的Flutter应用

# 如果尚未安装CLI,请先安装
dart pub global activate flutterfire_cli

# 运行 `configure` 命令,选择Firebase项目和平台
flutterfire configure
3. 启用Cloud Firestore数据库 #
# 项目设置 > 数据库 > 创建数据库
# 选择位置
# 添加名为“private”的集合
# 添加名为“public”的集合
4. 为Android应用启用互联网 #

在AndroidManifest.xml文件中添加以下行:

  <uses-permission android:name="android.permission.INTERNET"/>
5. 为Web应用启用Google客户端ID #

示例:web/index.html

在web/index.html中添加以下行:

<meta name="google-signin-client_id" content="YOUR_OWN_ID.apps.googleusercontent.com">

实现 #

1. main.dart #

示例:main.dart

在运行应用之前添加以下代码:

void main() async {
  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  ); // 只有在运行'flutterfire configure'之前才能这样做!

  runApp(const App());
}
2. 将您的应用包装在FirebaseMultiFactorAuth小部件中 #

示例:app.dart

FirebaseMultiFactorAuthWidget(
  loginWidget: LoginWidget(),
  otpControllerWidget: OTPControllerWidget(
    phoneInputWidget: OTPPhoneWidget(),
    otpSentWidget: OTPVerificationWidget(),
    firstLoginWidget: UsernameInputWidget(),
  ),
  mainWidget: MainWidget(),
),
2.1 登录小部件 #

示例:login_widget.dart

实现您的登录页面,使用loginFirstProvider函数。

以下函数将触发Google登录流程:

ElevatedButton.icon(
  label: Text("登录Google"),
  icon: Icon(Icons.g_mobiledata_outlined),
  onPressed: () {
    FirebaseMultiFactorAuth.loginFirstProvider(
      context: context, 
      authType: MultiFactorAuthType.GOOGLE);
  },
),
2.2 OTP电话号码小部件 #

示例:otp_phone_input.dart

实现您的电话号码输入小部件。

使用以下函数可以触发电话号码检查和OTP发送流程:

FirebaseMultiFactorAuth.inputPhoneNumberSendOTP(
  context: context, 
  phoneNumber: phoneController.text
);
2.3 OTP验证小部件 #

示例:otp_verification_input.dart

实现您的OTP输入小部件。

使用以下函数可以触发OTP验证流程:

await FirebaseMultiFactorAuth.inputPhoneOTP(
  context: this.context, 
  otpCode: _otpController.text
);
2.4 首次登录小部件 #

示例:first_login_widget.dart

实现用户首次登录时显示的小部件。

使用以下函数可以禁用用户的首次登录小部件以供下次登录使用:

/* 您的代码和可能的一些Firestore调用 */

await FirebaseMultiFactorAuth.setFirstLogin(
  context: context, 
  isFirstLogin: false
);
3. 主小部件 #

主小部件只是您的应用,当且仅当用户通过两种方式登录时才允许运行。

常见错误 #

Google登录 #
登录Google时出错: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)

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

1 回复

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


firebase_multi_factor_auth 是一个用于在 Flutter 应用中实现多因素认证(MFA)的插件。它允许你使用 Firebase Authentication 来实现多因素认证,从而提高应用的安全性。以下是如何在 Flutter 项目中使用 firebase_multi_factor_auth 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 firebase_multi_factor_auth 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: latest_version
  firebase_auth: latest_version
  firebase_multi_factor_auth: latest_version

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

2. 初始化 Firebase

在你的 Flutter 应用中初始化 Firebase。通常,你可以在 main.dart 文件中进行初始化:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter MFA Demo',
      home: MfaScreen(),
    );
  }
}

3. 实现多因素认证

接下来,你可以在你的应用中使用 firebase_multi_factor_auth 插件来实现多因素认证。以下是一个简单的示例,展示了如何启用和使用 MFA:

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

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

class _MfaScreenState extends State<MfaScreen> {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final FirebaseMultiFactorAuth _mfa = FirebaseMultiFactorAuth.instance;
  String _verificationId = '';
  String _smsCode = '';

  Future<void> _enableMfa() async {
    final User user = _auth.currentUser!;
    await _mfa.enableMfa(user);
  }

  Future<void> _verifyPhoneNumber() async {
    final User user = _auth.currentUser!;
    await _mfa.verifyPhoneNumber(
      user,
      phoneNumber: '+1234567890', // 替换为用户的电话号码
      codeSent: (String verificationId, int? resendToken) {
        setState(() {
          _verificationId = verificationId;
        });
      },
      codeAutoRetrievalTimeout: (String verificationId) {
        setState(() {
          _verificationId = verificationId;
        });
      },
    );
  }

  Future<void> _verifySmsCode() async {
    final User user = _auth.currentUser!;
    await _mfa.verifySmsCode(user, _verificationId, _smsCode);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multi-Factor Authentication'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: _enableMfa,
              child: Text('Enable MFA'),
            ),
            ElevatedButton(
              onPressed: _verifyPhoneNumber,
              child: Text('Verify Phone Number'),
            ),
            TextField(
              decoration: InputDecoration(labelText: 'SMS Code'),
              onChanged: (value) {
                setState(() {
                  _smsCode = value;
                });
              },
            ),
            ElevatedButton(
              onPressed: _verifySmsCode,
              child: Text('Verify SMS Code'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部