Flutter密码管理插件passkeys的使用
Flutter密码管理插件passkeys的使用
passkeys
一个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应用
- 依赖方服务器(后端,用于存储用户的公钥)
注册流程
- 用户提供电子邮件地址或用户名给应用。
- 应用将此电子邮件地址发送到依赖方服务器。
- 依赖方服务器返回
publicKeyCredentialCreationOptions
,包含设置passkey所需的所有信息。 - 应用与设备操作系统交互,要求用户通过生物识别设置passkey。
- 创建私钥和公钥,私钥安全存储在用户设备上,公钥发送到依赖方服务器。
- 依赖方服务器验证并存储公钥,然后响应成功消息(例如JWT令牌)。
登录流程
- 用户提供生物识别信息以访问私钥。
- 应用向依赖方服务器请求挑战,并使用私钥签名挑战。
- 签名后的挑战发送到依赖方服务器,服务器使用公钥验证签名,并返回成功消息(例如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);
}
常见用例
- 原型开发:如果你想在Flutter应用中快速体验passkeys,可以参考示例代码。
- 已有依赖方服务器:如果你已经有一个实现了WebAuthn标准的依赖方服务器,可以使用此包抽象平台特定代码。
- 不想构建依赖方服务器:可以使用现有的解决方案如Corbado作为依赖方服务器。
- 与Firebase集成:可以使用
corbado_auth_firebase
包。
故障排除
Android
- 确保已登录Google账户:Google备份所有passkeys,因此需要登录Google账户。
- 设置屏幕锁或生物识别:确保设备设置了屏幕锁或生物识别。
- 使用支持Play Store的模拟器:确保使用API版本为33或34且支持Play Store的模拟器。
iOS
- 启用生物识别:确保启用了Face ID或Touch ID。
Web
- 更新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
更多关于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
。
注意事项
- 平台支持:WebAuthn API 主要在较新的浏览器和操作系统版本中得到支持。确保你的目标平台支持WebAuthn。
- 依赖版本:在实际项目中,请确保使用最新版本的
flutter_webauthn
插件,并查看其文档以获取最新的API和使用指南。 - 安全性:Passkeys 提供了一种更安全的身份验证方式,但务必遵循最佳实践,确保你的应用安全。
这个示例提供了一个基础框架,你可以根据需要进行扩展和定制。