Flutter密码管理插件passkeys的使用

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

Flutter密码管理插件passkeys的使用

passkeys

GitHub Repo Cover

一个Flutter包,通过passkeys(基于WebAuthn/FIDO2)实现身份验证。

你可以访问实时演示(这是在Vercel上部署的示例的Flutter Web版本)以了解更多信息。

支持平台

平台 Android iOS Linux macOS Web Windows
支持

特性

  • 在iOS、Android和Web上使用passkeys注册和登录用户。
  • 使用条件UI登录用户。

入门指南

当你想了解passkeys的工作原理时,有三个主要角色:

  • Flutter应用的用户
  • 安装在具有Face ID或Touch ID等生物识别功能设备上的Flutter应用
  • 依赖方服务器(后端,用于存储用户的公钥)

注册流程

  1. 用户提供电子邮件地址或用户名给应用。
  2. 应用将此电子邮件地址发送到依赖方服务器。
  3. 依赖方服务器返回publicKeyCredentialCreationOptions,包含设置passkey所需的所有信息。
  4. 应用与设备操作系统交互,要求用户通过生物识别设置passkey。
  5. 创建私钥和公钥,私钥安全存储在用户设备上,公钥发送到依赖方服务器。
  6. 依赖方服务器验证并存储公钥,然后响应成功消息(例如JWT令牌)。

登录流程

  1. 用户提供生物识别信息以访问私钥。
  2. 应用向依赖方服务器请求挑战,并使用私钥签名挑战。
  3. 签名后的挑战发送到依赖方服务器,服务器使用公钥验证签名,并返回成功消息(例如JWT令牌)。

示例代码

要运行示例,请按照以下步骤操作:

git clone git@github.com:corbado/flutter-passkeys.git

如果你要在iOS模拟器或Android模拟器上运行示例,请启动一个模拟器。然后运行以下命令:

melos run example-passkeys-native

注册用户

_register() async {
  final passkeyAuthenticator = PasskeyAuthenticator();
  final relyingPartyServer = RelyingPartyServer(); // 这不是本包的一部分

  // 开始注册
  final webAuthnChallenge = await relyingPartyServer.startSignUpWithPasskey(
      'user@example.com', 'Username');
  // 注册新passkey
  final platformRes = await passkeyAuthenticator.register(webAuthnChallenge);
  // 完成注册
  final relyingPartyServerRes = await relyingPartyServer.finishSignUpWithPasskey(platformRes);
}

登录用户

_signIn() async {
  final passkeyAuthenticator = PasskeyAuthenticator();
  final relyingPartyServer = RelyingPartyServer(); // 这不是本包的一部分

  // 开始登录
  final webAuthnChallenge = await relyingPartyServer.startLoginWithPasskey('user@example.com');
  // 请求用户使用passkey签名挑战
  final platformRes = await passkeyAuthenticator.authenticate(webAuthnChallenge);
  // 完成登录
  final relyingPartyServerRes = await relyingPartyServer.finishLoginWithPasskey(platformRes);
}

常见用例

  1. 原型开发:如果你想在Flutter应用中快速体验passkeys,可以参考示例代码。
  2. 已有依赖方服务器:如果你已经有一个实现了WebAuthn标准的依赖方服务器,可以使用此包抽象平台特定代码。
  3. 不想构建依赖方服务器:可以使用现有的解决方案如Corbado作为依赖方服务器。
  4. 与Firebase集成:可以使用corbado_auth_firebase包。

故障排除

Android

  1. 确保已登录Google账户:Google备份所有passkeys,因此需要登录Google账户。
  2. 设置屏幕锁或生物识别:确保设备设置了屏幕锁或生物识别。
  3. 使用支持Play Store的模拟器:确保使用API版本为33或34且支持Play Store的模拟器。

iOS

  1. 启用生物识别:确保启用了Face ID或Touch ID。

Web

  1. 更新index.html:在web/index.html中添加JavaScript库。
<script src="https://github.com/corbado/flutter-passkeys/releases/download/2.0.0-dev.1/bundle.js" type="application/javascript"></script>

要求

  • 此包要求Flutter 3.19.0或更高版本。

示例项目结构

以下是示例项目的主入口文件main.dart的代码:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:passkeys_example/router.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(
    const ProviderScope(
      child: MyApp(),
    ),
  );
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: router,
      theme: ThemeData(
        useMaterial3: false,
        colorScheme: const ColorScheme(
          brightness: Brightness.light,
          primary: Color(0xFF1953ff),
          onPrimary: Colors.white,
          secondary: Colors.white,
          onSecondary: Colors.black,
          error: Colors.redAccent,
          onError: Colors.white,
          background: Color(0xFF1953ff),
          onBackground: Colors.white,
          surface: Color(0xFF1953ff),
          onSurface: Color(0xFF1953ff),
        ),
      ),
    );
  }
}

希望这些信息能帮助你在Flutter应用中成功集成passkeys!如果有任何问题,欢迎随时提问。


更多关于Flutter密码管理插件passkeys的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter密码管理插件passkeys的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,Passkeys 是一种现代、安全的方式来管理用户的密码和身份验证信息。Passkeys 是基于 WebAuthn API 构建的,该 API 旨在提供一种更安全的替代方案,以取代传统的基于密码的身份验证方法。

要在Flutter应用中使用Passkeys,你可以结合使用 flutter_webauthn 插件,该插件提供了对 WebAuthn API 的访问。下面是一个简单的代码示例,展示了如何在Flutter应用中实现Passkeys的注册和验证。

添加依赖

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

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

然后运行 flutter pub get 来获取依赖。

注册Passkey

下面是一个注册Passkey的示例代码:

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

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

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

class _MyAppState extends State<MyApp> {
  String? registeredCredentialId;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Passkey Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  try {
                    var credential = await FlutterWebAuthn.register(
                      RelyingPartyIdentifier('example.com'),
                      UserIdentifier('user@example.com'),
                      CredentialParameters([
                        PublicKeyCredentialParameters(
                          type: 'public-key',
                          alg: COSEAlgorithm.ES256,
                        ),
                      ]),
                      AuthenticatorSelectionCriteria(
                        requireResidentKey: true,
                        userVerification: 'required',
                      ),
                      AttestationConveyancePreference.direct,
                    );

                    setState(() {
                      registeredCredentialId = credential.id;
                    });

                    print('Credential registered: ${credential.id}');
                  } catch (e) {
                    print('Error registering credential: $e');
                  }
                },
                child: Text('Register Passkey'),
              ),
              if (registeredCredentialId != null)
                Text('Passkey registered with credential ID: $registeredCredentialId'),
            ],
          ),
        ),
      ),
    );
  }
}

验证Passkey

下面是一个验证Passkey的示例代码:

ElevatedButton(
  onPressed: () async {
    try {
      var assertion = await FlutterWebAuthn.getAssertion(
        RelyingPartyIdentifier('example.com'),
        AllowedCredentialDescriptors([
          AllowedCredentialDescriptor(
            id: registeredCredentialId!,
            type: 'public-key',
          ),
        ]),
        AuthenticatorSelectionCriteria(
          userVerification: 'required',
        ),
        ClientExtensionResults(),
      );

      print('Assertion verified: ${assertion.credentialId}');
    } catch (e) {
      print('Error verifying credential: $e');
    }
  },
  child: Text('Verify Passkey'),
),

你可以将验证按钮添加到你的UI中,确保在调用 FlutterWebAuthn.getAssertion 时使用之前注册的 credentialId

注意事项

  1. 平台支持:WebAuthn API 主要在较新的浏览器和操作系统版本中得到支持。确保你的目标平台支持WebAuthn。
  2. 依赖版本:在实际项目中,请确保使用最新版本的 flutter_webauthn 插件,并查看其文档以获取最新的API和使用指南。
  3. 安全性:Passkeys 提供了一种更安全的身份验证方式,但务必遵循最佳实践,确保你的应用安全。

这个示例提供了一个基础框架,你可以根据需要进行扩展和定制。

回到顶部