Flutter安全认证插件flutter_passkey的使用

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

Flutter安全认证插件flutter_passkey的使用

flutter_passkey 是一个用于在Flutter应用中实现Passkey认证功能的插件。该插件目前支持Android和iOS平台。

平台支持情况

Android iOS MacOS Web Linux Windows
V V X X X X

使用方法

要在Flutter项目中使用这个插件,首先需要在 pubspec.yaml 文件中添加 flutter_passkey 作为依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_passkey: ^latest_version

示例代码

以下是一个完整的示例应用程序,展示了如何使用 flutter_passkey 插件来注册和验证 Passkey。

main.dart

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

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _flutterPasskeyPlugin = FlutterPasskey();
  bool _isPasskeySupported = false;

  // 模拟从服务器获取创建选项
  String _getCredentialCreationOptions() {
    // 这里应该从服务器获取实际数据
    return '{"challenge":"some-challenge","rp":{"name":"Example RP"},"user":{"id":"user-id","name":"User Name","displayName":"Display Name"},"pubKeyCredParams":[{"type":"public-key","alg":-7}]}';
  }

  // 模拟从服务器获取请求选项
  String _getCredentialRequestOptions() {
    // 这里应该从服务器获取实际数据
    return '{"challenge":"some-challenge","allowCredentials":[{"type":"public-key","id":"credential-id"}],"rpId":"example.com"}';
  }

  @override
  void initState() {
    super.initState();
    _flutterPasskeyPlugin.isSupported().then((value) => setState(() {
      _isPasskeySupported = value;
    }));
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Container(
          padding: const EdgeInsets.all(40),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              if (!_isPasskeySupported)
                const Center(
                  child: Text("This platform doesn't support Passkey."),
                ),
              if (_isPasskeySupported)
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    FilledButton(
                      onPressed: () {
                        final options = _getCredentialCreationOptions();
                        _flutterPasskeyPlugin.createCredential(options).then((response) {
                          // 将响应发送到服务器
                          print('Create Credential Response: $response');
                        }).catchError((error) {
                          // 处理错误
                          print('Error creating credential: $error');
                        });
                      },
                      child: const Text("Register Passkey"),
                    ),
                    FilledButton(
                      onPressed: () {
                        final options = _getCredentialRequestOptions();
                        _flutterPasskeyPlugin.getCredential(options).then((response) {
                          // 将响应发送到服务器
                          print('Get Credential Response: $response');
                        }).catchError((error) {
                          // 处理错误
                          print('Error getting credential: $error');
                        });
                      },
                      child: const Text("Verify Passkey"),
                    ),
                  ],
                ),
            ],
          ),
        ),
      ),
    );
  }
}

更多信息

了解更多关于 flutter_passkey 的信息和示例,请参考以下资源:

通过以上步骤,您可以在Flutter应用中集成Passkey认证功能,提高应用的安全性。请确保根据您的具体需求调整代码,并从服务器获取正确的认证选项。


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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用flutter_passkey插件来实现安全认证的代码示例。flutter_passkey插件允许你利用iOS和Android的原生Passkey API来实现无密码认证。请注意,由于这是一个相对较新的功能,你可能需要确保你的开发环境和依赖项是最新的。

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

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

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

接下来,我们编写一个基本的Flutter应用来演示如何使用flutter_passkey插件。

示例代码

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Passkey Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final FlutterPasskey _flutterPasskey = FlutterPasskey();

  Future<void> _registerPasskey() async {
    try {
      // 注册Passkey
      final result = await _flutterPasskey.register(
        rpId: 'https://your-relying-party-identifier.com', // 你的RP ID
        name: 'User@example.com', // 用户名
        displayName: 'John Doe', // 显示名称
        iconUrl: 'https://your-server.com/icon.png', // 图标URL
        challenge: 'unique_challenge_string', // 挑战字符串,通常用于防止重放攻击
        timeout: 60000, // 超时时间(毫秒)
        userVerification: UserVerificationRequirement.required, // 用户验证要求
      );

      if (result.isSuccessful) {
        print('Passkey registered successfully.');
      } else {
        print('Passkey registration failed: ${result.errorMessage}');
      }
    } catch (e) {
      print('Error during Passkey registration: $e');
    }
  }

  Future<void> _authenticateWithPasskey() async {
    try {
      // 使用Passkey进行认证
      final result = await _flutterPasskey.authenticate(
        rpId: 'https://your-relying-party-identifier.com', // 你的RP ID
        challenge: 'unique_challenge_string', // 挑战字符串
        allowCredentials: [], // 可选的,用于指定允许使用的凭证列表(在此示例中为空)
        timeout: 60000, // 超时时间(毫秒)
        userVerification: UserVerificationRequirement.preferred, // 用户验证要求
      );

      if (result.isSuccessful) {
        print('Authentication successful.');
        // 处理认证成功后的逻辑
      } else {
        print('Authentication failed: ${result.errorMessage}');
      }
    } catch (e) {
      print('Error during authentication: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Passkey Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _registerPasskey,
              child: Text('Register Passkey'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _authenticateWithPasskey,
              child: Text('Authenticate with Passkey'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. RP ID (Relying Party Identifier): 这是你的服务标识符,通常是一个HTTPS URL。确保你在注册和认证时使用相同的RP ID。
  2. 挑战字符串 (Challenge): 这是一个唯一的字符串,用于防止重放攻击。在实际应用中,你应该生成一个安全的随机字符串。
  3. 用户验证要求 (User Verification Requirement): 你可以指定是否需要用户验证(如指纹、面部识别等)。

这个示例代码展示了如何使用flutter_passkey插件进行Passkey的注册和认证。在实际应用中,你可能需要处理更多的错误情况和边界情况,以及根据需求调整用户界面和交互逻辑。

回到顶部