近年、Apple・Google・Microsoftが推進している認証方式として注目を集めているのが Passkey(パスキー) です。
Passkeyを利用すると、
- パスワード不要
- フィッシング耐性が高い
- Face IDやTouch IDでログイン
- パスワード忘れが発生しない
といったメリットがあります。
しかしFlutterでPasskey認証を実装しようとすると、
- WebAuthn
- FIDO2
- Android Credential Manager
- iOS Authentication Services
など複数のプラットフォーム固有実装が必要になります。
そんな複雑な処理を統一的に扱えるのが passkeys パッケージです。
Passkeyとは?
Passkeyは、WebAuthn/FIDO2をベースにしたパスワードレス認証方式です。
従来のパスワード認証では、
メールアドレス
+
パスワード
を利用していました。
Passkeyでは、
メールアドレス
+
Face ID
または
メールアドレス
+
指紋認証
だけでログインできます。
認証時に秘密鍵は端末外へ送信されないため、フィッシング攻撃やパスワード漏洩への耐性が高いとされています。
passkeysとは?
passkeysは、Flutter向けのPasskey認証ライブラリです。
WebAuthn/FIDO2をFlutterから利用できるようにし、
- Passkey登録
- Passkeyログイン
- 生体認証連携
- 条件付きUI(Conditional UI)
- Passkey利用可否判定
などを簡単に実装できます。
主な特徴
マルチプラットフォーム対応
対応プラットフォームは以下です。
| Platform | Support |
|---|---|
| Android | ✅ |
| iOS | ✅ |
| macOS | ✅ |
| Web | ✅ |
| Windows | ✅ |
| Linux | ❌ |
Flutterアプリを複数プラットフォームで展開する場合でも共通コードで実装できます。
WebAuthn / FIDO2対応
Passkey認証の標準規格である
- WebAuthn
- FIDO2
に対応しています。
そのため独自実装を行う必要がありません。
自前バックエンドでも利用可能
このパッケージは、
- 自前のRelying Party Server
- Corbado
の両方に対応しています。
既存認証システムへPasskeyを追加したい場合にも導入できます。
インストール
pubspec.yamlへ追加します。
dependencies:
passkeys: ^2.20.0
続いて、
flutter pub get
を実行します。
Passkey認証の仕組み
Passkeyでは主に3つの要素が登場します。
ユーザー
↓
Flutterアプリ
↓
Relying Party Server
流れとしては、
登録
1. ユーザー登録
2. サーバーがChallenge発行
3. 生体認証
4. 鍵ペア生成
5. 公開鍵をサーバー保存
ログイン
1. サーバーがChallenge発行
2. 生体認証
3. Challenge署名
4. サーバー検証
5. ログイン成功
となります。
Passkey登録
登録処理の基本的な流れです。
final authenticator =
PasskeyAuthenticator();
final challenge =
await api.startSignup();
final result =
await authenticator.register(
challenge,
);
await api.finishSignup(
result,
);
流れとしては、
- サーバーへ登録開始要求
- Challenge取得
- Passkey作成
- サーバーへ送信
となります。
Passkeyログイン
ログインも同様です。
final challenge =
await api.startLogin();
final result =
await authenticator.authenticate(
challenge,
);
await api.finishLogin(
result,
);
Face IDや指紋認証が表示され、認証成功後にログインできます。
Conditional UI対応
近年のPasskey認証では、
メールアドレス入力
↓
Passkey候補表示
↓
Face ID
というUXが一般的です。
passkeysはこのConditional UIにも対応しています。
ユーザー体験を大幅に向上できます。
Passkey利用可否を判定
端末がPasskeyを利用できるか確認できます。
final availability =
await authenticator
.getAvailability()
.ios();
if (
availability
.hasPasskeySupport
) {
enablePasskey();
}
Passkey非対応端末では通常ログインへフォールバックできます。
Firebaseとの連携
公式ではFirebase向けライブラリも提供されています。
corbado_auth_firebase
を利用することで、
- Firebase Authentication
- Passkey
を組み合わせた認証システムを構築できます。
Passkeys Doctorが便利
Passkey実装で最も大変なのは設定です。
例えば、
- AASA設定ミス
- Digital Asset Links設定ミス
- RPID設定ミス
などが頻繁に発生します。
passkeysには Passkeys Doctor が搭載されており、設定ミスを診断できます。
利用方法は簡単です。
final authenticator =
PasskeyAuthenticator(
debugMode: true,
);
これだけで診断機能が有効になります。
実際の導入難易度
Passkey認証自体は簡単ですが、
以下の設定が必要になります。
Android
- Googleアカウント
- Credential Manager
- Digital Asset Links
iOS
- Associated Domains
- Apple App Site Association (AASA)
Web
- HTTPS
- WebAuthn設定
Flutterコードよりもインフラ設定の方が難しいケースが多いです。
メリット
パスワードレス認証を実装できる
Face IDや指紋認証のみでログイン可能になります。
マルチプラットフォーム対応
Android・iOS・Web・macOS・Windowsをサポートしています。
自前サーバーでも利用可能
既存認証基盤へ統合できます。
診断ツールが優秀
Passkeys Doctorで設定ミスを検出できます。
注意点
バックエンドが必須
Passkey認証には
Relying Party Server
が必要です。
Firebase Authだけで完結するものではありません。
初期設定がやや複雑
Passkeyはセキュリティ要件が厳しいため、
- ドメイン設定
- AASA
- Digital Asset Links
などの設定が必要になります。
実機テスト推奨
生体認証を利用するため、
エミュレーターだけでは十分な検証ができません。
まとめ
passkeysは、FlutterでPasskey認証を実装するための本格的なライブラリです。
特に、
- パスワードレス認証
- Face IDログイン
- Touch IDログイン
- FIDO2対応
- WebAuthn対応
を実現したいアプリに最適です。
近年はGoogle・Apple・MicrosoftがPasskeyを強く推進しており、多くのサービスが導入を進めています。Flutterアプリでも今後の標準的な認証方式になる可能性が高く、認証機能を設計する際にはぜひ検討したいパッケージと言えるでしょう。
