Flutter网页OTP(一次性密码)无输入插件otpless_flutter_web的使用

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

Flutter网页OTP(一次性密码)无输入插件otpless_flutter_web的使用

在Flutter网站中集成一键式无输入OTP登录功能,通过我们的SDK可以简化流程。本指南详细介绍了安装SDK和无缝获取用户信息的步骤。

1. 安装 OTPless SDK 依赖

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

flutter pub add otpless_flutter_web:1.2.6

2. 在 index.html 中初始化 Otpless

在你的 web/index.html 文件中添加以下脚本以启动 otpless:

<!-- Add this script to initiate otpless -->
<script
  data-appid="{YOUR_APP_ID}"
  src="https://otpless.com/v2/flutter.js"
  id="otpless-sdk"
  type="text/javascript"
  variant="HEADLESS"
></script>

请确保将 {YOUR_APP_ID} 替换为你自己的应用ID。

3. 配置注册/登录

导入所需类

在你的 Dart 文件中导入以下类:

import 'package:otpless_flutter_web/otpless_flutter_web.dart';
在 initState() 方法中添加代码

在你的 StatefulWidget 的 initState() 方法中添加以下代码:

[@override](/user/override)
void initState() {
  _otplessFlutterPlugin.headlessResponse(onHeadlessResult); // 初始化回调函数
  super.initState();
}
添加处理回调响应的代码

定义一个方法来处理回调结果:

void onHeadlessResult(dynamic result) {
  setState(() {
    dataResponse = result; // 更新状态以显示结果
  });
}
添加 OAuth 认证代码

定义一个方法来发起 OAuth 认证:

void initiateOAuth(String channelType) async {
  _otplessFlutterPlugin.initiateOAuth(onHeadlessResult, channelType);
}
添加 PHONE/EMAIL 认证代码

定义一个方法来处理电话或电子邮件认证:

void initiatePhoneEmailAuth() async {
  Map<String, dynamic> arg = {};
  if (otpContoller.text.isNotEmpty) {
    if (phoneNumberContoller.text.isNotEmpty) {
      arg["phone"] = phoneNumberContoller.text;
      arg["countryCode"] = "91";
    } else {
      arg["email"] = emailContoller.text;
    }

    arg["otp"] = otpContoller.text;

    _otpless_flutterPlugin.verifyAuth(onHeadlessResult, arg);
  } else {
    if (phoneNumberContoller.text.isNotEmpty) {
      arg["phone"] = phoneNumberContoller.text;
      arg["countryCode"] = "91";

      _otpless_flutterPlugin.initiatePhoneAuth(onHeadlessResult, arg);
    } else if (emailContoller.text.isNotEmpty) {
      arg["email"] = emailContoller.text;

      _otpless_flutterPlugin.initiateEmailAuth(onHeadlessResult, arg);
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
          content: Text("请输入电话号码或电子邮件"),
        ),
      );
    }
  }
}

完整示例 Demo

以下是一个完整的示例应用程序,展示了如何使用 otpless_flutter_web 插件进行 OTP 登录:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:otpless_flutter_web/otpless_flutter_web.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Otpless Flutter Web Testing',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomeScreen(),
    );
  }
}

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

  [@override](/user/override)
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String? name;
  String? data;
  String dataResponse = 'Unknown';
  final TextEditingController phoneNumberContoller = TextEditingController();
  final TextEditingController otpContoller = TextEditingController();
  final TextEditingController emailContoller = TextEditingController();
  final _otplessFlutterPlugin = Otpless();

  void onHeadlessResult(dynamic result) {
    print(result);
    setState(() {
      dataResponse = result;
    });
  }

  void initiateOAuth(String channelType) async {
    _otplessFlutterPlugin.initiateOAuth(onHeadlessResult, channelType);
  }

  void initiatePhoneEmailAuth() async {
    Map<String, dynamic> arg = {};
    if (otpContoller.text.isNotEmpty) {
      if (phoneNumberContoller.text.isNotEmpty) {
        arg["phone"] = phoneNumberContoller.text;
        arg["countryCode"] = "91";
      } else {
        arg["email"] = emailContoller.text;
      }

      arg["otp"] = otpContoller.text;

      _otplessFlutterPlugin.verifyAuth(onHeadlessResult, arg);
    } else {
      if (phoneNumberContoller.text.isNotEmpty) {
        arg["phone"] = phoneNumberContoller.text;
        arg["countryCode"] = "91";

        _otplessFlutterPlugin.initiatePhoneAuth(onHeadlessResult, arg);
      } else if (emailContoller.text.isNotEmpty) {
        arg["email"] = emailContoller.text;

        _otplessFlutterPlugin.initiateEmailAuth(onHeadlessResult, arg);
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(
            content: Text("请输入电话号码或电子邮件"),
          ),
        );
      }
    }
  }

  [@override](/user/override)
  void initState() {
    _otplessFlutterPlugin.headlessResponse(onHeadlessResult);
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 50),
          child: Column(
            children: [
              Text(
                "Name : $name",
                style: const TextStyle(fontSize: 25),
              ),
              const SizedBox(height: 10),
              Text(
                "Data : $data",
                style: const TextStyle(fontSize: 25),
              ),
              TextField(
                controller: phoneNumberContoller,
                keyboardType: TextInputType.number,
                decoration: const InputDecoration(hintText: "电话号码"),
              ),
              const SizedBox(height: 10),
              TextField(
                controller: emailContoller,
                decoration: const InputDecoration(hintText: "电子邮件"),
              ),
              const SizedBox(height: 50),
              TextField(
                controller: otpContoller,
                keyboardType: TextInputType.number,
                decoration: const InputDecoration(hintText: "OTP"),
              ),
              const Spacer(),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  ElevatedButton(
                    onPressed: () {
                      initiatePhoneEmailAuth();
                    },
                    child: const Text("PHONE/EMAIL"),
                  ),
                  ElevatedButton(
                    onPressed: () {
                      initiateOAuth("GOOGLE");
                    },
                    child: const Text("OAUTH"),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter网页OTP(一次性密码)无输入插件otpless_flutter_web的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网页OTP(一次性密码)无输入插件otpless_flutter_web的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter Web项目中集成和使用otpless_flutter_web插件来实现无输入OTP(一次性密码)验证的一个基本示例。这个插件允许你通过预填充的OTP直接在网页上完成验证,而不需要用户手动输入OTP。

首先,确保你的Flutter环境已经配置好,并且你的项目已经迁移到null safety。然后,按照以下步骤操作:

  1. 添加依赖

    在你的pubspec.yaml文件中添加otpless_flutter_web依赖:

    dependencies:
      flutter:
        sdk: flutter
      otpless_flutter_web: ^最新版本号 # 替换为实际的最新版本号
    

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

  2. 配置Web支持

    确保你的index.html文件位于web目录下,并且已经正确配置了Flutter Web的支持。

  3. 使用插件

    下面是一个基本的示例代码,展示如何在Flutter Web中使用otpless_flutter_web插件:

    import 'package:flutter/material.dart';
    import 'package:otpless_flutter_web/otpless_flutter_web.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('OTP Less Flutter Web Example'),
            ),
            body: Center(
              child: OTPlessExample(),
            ),
          ),
        );
      }
    }
    
    class OTPlessExample extends StatefulWidget {
      @override
      _OTPlessExampleState createState() => _OTPlessExampleState();
    }
    
    class _OTPlessExampleState extends State<OTPlessExample> {
      late OTPless _otpLess;
    
      @override
      void initState() {
        super.initState();
        // 初始化OTPless实例
        _otpLess = OTPless(
          // 替换为你的OTP服务URL
          otpServiceUrl: 'https://your-otp-service-url.com/api/v1/otp',
          // 替换为你的客户端ID和密钥
          clientId: 'your-client-id',
          clientSecret: 'your-client-secret',
        );
    
        // 启动OTPless流程
        _startOTPlessFlow();
      }
    
      void _startOTPlessFlow() async {
        try {
          // 启动OTPless流程,这通常会打开一个隐藏的iframe来处理OTP
          await _otpLess.start();
    
          // 监听OTP验证状态
          _otpLess.otpVerified.listen((bool isVerified) {
            if (isVerified) {
              // OTP验证成功
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text('OTP Verified Successfully!')),
              );
            } else {
              // OTP验证失败
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text('OTP Verification Failed!')),
              );
            }
          });
        } catch (e) {
          // 处理错误
          print('Error starting OTPless flow: $e');
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Error: $e')),
          );
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Waiting for OTP to be verified...'),
          ],
        );
      }
    
      @override
      void dispose() {
        // 释放资源
        _otpLess.dispose();
        super.dispose();
      }
    }
    

    请注意,上面的代码是一个基本的示例,你可能需要根据你的具体需求调整OTP服务的URL、客户端ID和密钥等参数。此外,OTPless类的方法(如start)和属性(如otpVerified)可能会根据你的otpless_flutter_web插件版本有所不同,请参考最新的官方文档或源代码以获取最新的API信息。

  4. 运行应用

    使用flutter run -d chrome命令来在Chrome浏览器中运行你的Flutter Web应用。

这个示例展示了如何初始化OTPless实例,启动OTP验证流程,并监听OTP验证的状态。在实际应用中,你可能需要更复杂的UI和错误处理逻辑。

回到顶部