Flutter双重认证插件flutter_2fa的使用

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

Flutter双重认证插件flutter_2fa的使用

Flutter 2FA

🔐 这个包可以帮助在任何Flutter项目中轻松添加双因素认证。

📸 屏幕截图

屏幕截图 屏幕截图 屏幕截图 屏幕截图 屏幕截图

🚀 如何使用插件

激活双因素认证

在任何按钮或按下操作中调用activate方法来启动Flutter 2FA。

import 'package:flutter_2fa/flutter_2fa.dart';

void launch() async {
     await Flutter2FA().activate(
                     context: context,
                     appName: "Flutter 2FA", // 您的应用名
                     email: "hipheckt@xyz.com" // 需要认证的用户邮箱
                     );
}

验证用户认证

调用verify方法来验证用户是否通过了双因素认证。

import 'package:flutter_2fa/flutter_2fa.dart';

     ...
        void verify() async {
            await Flutter2FA().verify(context: context);
        }
      ...

✨ 贡献

PR 和建议非常欢迎。


完整示例Demo

以下是一个完整的示例代码,展示了如何在Flutter应用中使用flutter_2fa插件。

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

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(home: Scaffold(body: MyHome()));
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Padding(
          padding: const EdgeInsets.all(25),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              SizedBox(
                  width: double.infinity,
                  height: 56,
                  child: ElevatedButton(
                    onPressed: () => Flutter2FA().activate(
                        context: context,
                        appName: "Flutter 2FA",
                        email: "hipheckt@xyz.com"),
                    child: const Text('激活2FA'),
                  )),
              const SizedBox(height: 30),
              SizedBox(
                  width: double.infinity,
                  height: 56,
                  child: ElevatedButton(
                    onPressed: () => Flutter2FA()
                        .verify(context: context, page: const Success()),
                    style: ButtonStyle(
                      backgroundColor: MaterialStateProperty.all<Color>(Colors.green),
                    ),
                    child: const Text('使用2FA登录'),
                  ))
            ],
          )),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(child: Text("用户登录成功!")),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用flutter_2fa插件来实现双重认证(2FA)的代码示例。flutter_2fa插件允许你生成和验证基于时间的一次性密码(TOTP),这是实现双重认证的一种常见方法。

首先,确保你已经在pubspec.yaml文件中添加了flutter_2fa依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_2fa: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用flutter_2fa插件:

1. 生成TOTP密钥和URL

首先,你需要生成一个用于TOTP的密钥,并创建一个TOTP URL,用户可以使用这个URL在支持TOTP的应用(如Google Authenticator)中扫描并添加账户。

import 'package:flutter/material.dart';
import 'package:flutter_2fa/flutter_2fa.dart';
import 'dart:convert';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String secretKey = '';
  String otpAuthUrl = '';

  @override
  void initState() {
    super.initState();
    _generateSecretKey();
  }

  void _generateSecretKey() {
    // 生成一个随机的密钥
    final key = Flutter2FA.generateSecretKey();
    setState(() {
      secretKey = base64Encode(key).toString();
      // 创建TOTP URL
      otpAuthUrl = Flutter2FA.generateOtpAuthUrl(
        secret: secretKey,
        issuer: 'MyApp',
        account: 'user@example.com',
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter 2FA Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text('Secret Key:'),
              Text(secretKey),
              SizedBox(height: 16),
              Text('OTP Auth URL:'),
              SelectableText(otpAuthUrl),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: () {
                  // 你可以在这里添加代码来处理URL的显示或分享
                },
                child: Text('Show/Share OTP URL'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

2. 验证TOTP

当用户输入从他们的TOTP应用(如Google Authenticator)中获取的一次性密码时,你可以使用以下代码来验证它:

Future<bool> _verifyOtp(String otp) async {
  bool isValid = await Flutter2FA.verifyOtp(
    secret: secretKey,
    otp: otp,
  );
  return isValid;
}

你可以在用户提交OTP的按钮点击事件中调用这个函数,并根据返回值来更新UI或执行其他逻辑。

完整示例

将上述代码片段整合到一个完整的示例中:

import 'package:flutter/material.dart';
import 'package:flutter_2fa/flutter_2fa.dart';
import 'dart:convert';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String secretKey = '';
  String otpAuthUrl = '';
  String? enteredOtp;

  @override
  void initState() {
    super.initState();
    _generateSecretKey();
  }

  void _generateSecretKey() {
    final key = Flutter2FA.generateSecretKey();
    setState(() {
      secretKey = base64Encode(key).toString();
      otpAuthUrl = Flutter2FA.generateOtpAuthUrl(
        secret: secretKey,
        issuer: 'MyApp',
        account: 'user@example.com',
      );
    });
  }

  Future<void> _verifyEnteredOtp() async {
    bool isValid = await Flutter2FA.verifyOtp(
      secret: secretKey,
      otp: enteredOtp!,
    );
    setState(() {
      if (isValid) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('OTP is valid!')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('OTP is invalid.')),
        );
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter 2FA Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text('Secret Key:'),
              Text(secretKey),
              SizedBox(height: 16),
              Text('OTP Auth URL:'),
              SelectableText(otpAuthUrl),
              SizedBox(height: 16),
              TextFormField(
                decoration: InputDecoration(labelText: 'Enter OTP'),
                onChanged: (value) {
                  setState(() {
                    enteredOtp = value;
                  });
                },
              ),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: enteredOtp != null ? _verifyEnteredOtp : null,
                child: Text('Verify OTP'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何生成一个TOTP密钥和URL,以及如何验证用户输入的OTP。用户可以将生成的URL输入到他们的TOTP应用中,然后输入从该应用中获取的一次性密码进行验证。

回到顶部