ハイライト
Automatic passkey upgrades は、ユーザーがパスワードでサインインした後、バックグラウンドで passkey を自動作成し通知する——サインインフローを中断しません。
主要内容
今日のサインイン体験はしばしば煩雑です:ユーザー名入力、パスワード入力、SMS コード待ち、コード入力——多段階フローはセキュリティを高めますが、速度を落とします。多くの app はサインイン後に「passkey を作成しますか?」という upsell を表示しますが、ユーザーは無視または拒否しがちです。
WWDC 2024 は automatic passkey upgrades を導入し、この流れを根本から変えます。通常のパスワードサインイン後、システムがバックグラウンドで passkey を作成し「passkey を作成しました」と通知。次回はワンタップで済みます。プロセス全体に中断型 upsell UI はありません。
セッションは、フィッシング対策の最善策はアカウントにフィッシング可能な認証要素を持たないことだと指摘します。パスワード、SMS、メールコード、プッシュ通知、TOTP——すべてフィッシング可能。真の目標はフィッシング可能な要素をすべて排除することで、passkey はその第一歩です。
詳細
Automatic passkey upgrades の仕組み
自動アップグレード要求を処理する際、システムは一連のチェックを実行します(04:18):
- システム内部チェック:クレデンシャルマネージャーが設定され、自動アップグレードをサポートしているか?デバイスにパスコードが設定されているか?
- Web 固有チェック:プライベートブラウジングタブではないか?
- クレデンシャルマネージャー条件:最も重要——そのマネージャーが直前にこのアカウントのユーザー名とパスワードを自動入力したか?
すべての条件を満たせば、システムは新規 passkey を返し、デバイスが通知を表示。満たさなければエラーを返し、UI は表示されません。
iOS/macOS 実装
従来の upsell 方式は次のとおり(01:19):
// Offering a passkey upsell
func signIn() async throws {
let userInfo = try await signInWithPassword()
guard !userInfo.hasPasskey else { return }
let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com")
guard try offerPasskeyUpsell() else { return }
let request = provider.createCredentialRegistrationRequest(
challenge: try await fetchChallenge(),
name: userInfo.user,
userID: userInfo.accountID)
do {
let passkey = try await authorizationController.performRequest(request)
// Save new passkey to the backend
} catch { … }
}
automatic passkey upgrades では requestStyle を .conditional に設定(02:18):
// Automatic passkey upgrade
func signIn() async throws {
let userInfo = try await signInWithPassword()
guard !userInfo.hasPasskey else { return }
let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com")
let request = provider.createCredentialRegistrationRequest(
challenge: try await fetchChallenge(),
name: userInfo.user,
userID: userInfo.accountID,
requestStyle: .conditional)
do {
let passkey = try await authorizationController.performRequest(request)
// Save new passkey to the backend
} catch { … }
}
キーポイント:
requestStyle: .conditionalでモーダル作成から条件付き自動作成に変更- システム条件を満たさない場合はエラー——従来の upsell ダイアログ表示や次回再試行が可能
- ユーザーの通常の app 利用をブロックしない
Web 実装
標準の Web passkey 登録はモーダル(03:15):
// Modal passkey creation
const options = {
"publicKey": {
"rp": { … },
"user": {
"name": userInfo.user,
…
},
"challenge": …,
"pubKeyCredParams": [ … ]
},
};
await navigator.credentials.create(options);
mediation: "conditional" を追加すると自動アップグレード(04:03):
// Automatic passkey creation
let capabilities = await PublicKeyCredential.getClientCapabilities();
if (!capabilities.conditionalCreate) { return; }
const options = {
"publicKey": {
"rp": { … },
"user": {
"name": userInfo.user,
…
},
"challenge": …,
"pubKeyCredParams": [ … ]
},
"mediation": "conditional"
};
await navigator.credentials.create(options);
キーポイント:
getClientCapabilities()でブラウザが条件付き作成をサポートするか確認mediation: "conditional"でユーザー明示確認からシステム条件判断に変更- 非対応なら従来のモーダル登録にフォールバック
クレデンシャルマネージャーの新機能
クレデンシャルマネージャー拡張に新能力(09:22):
- time-based verification codes(時間ベースの認証コード)をサポート
- 任意のテキストフィールドにユーザー名、パスワード、ワンタイムコードを自動入力
- AutoFill 用に最大 3 つの app を選択可能
Info.plist で能力を宣言(05:04):
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>ASCredentialProviderExtensionCapabilities</key>
<dict>
<key>ProvidesPasswords</key>
<true/>
<key>ProvidesPasskeys</key>
<true/>
<key>SupportsConditionalPasskeyRegistration</key>
<true/>
<key>ProvidesOneTimeCodes</key>
<true/>
<key>ProvidesTextToInsert</key>
<true/>
</dict>
</dict>
</dict>
キーポイント:
ProvidesPasswordsとProvidesPasskeysでサポートするクレデンシャルタイプを宣言SupportsConditionalPasskeyRegistrationで自動 passkey アップグレードをサポートProvidesOneTimeCodesでワンタイムコード自動入力ProvidesTextToInsertで任意テキストフィールドへの入力
Passwords app での表示
iOS 18 と macOS Sequoia で新 Passwords app が導入(10:17)。Web サイトと app をより良く表示するには:
- OpenGraph メタデータを使用:Passwords app は
og:site_nameでサイト名を表示 - 高解像度アイコンを提供:適切なアイコンファイルを用意
- otpauth:// リンクをサポート:認証コード設定をワンタップ体験に
同一アカウントに passkey とパスワードがある場合、Passwords app は 1 エントリに統合(11:34)。ユーザーは 1 箇所ですべてのサインイン方法を確認できます。
重要ポイント
1. 既存アカウントで自動 passkey アップグレードを有効化
- なぜ価値があるか:ユーザーは習慣を変えずに、より安全で高速なサインインを得られる。Apple のシステムレベル判断で適切なタイミングのみ passkey を作成し、不要なプロンプトを回避。
- 始め方:iOS/macOS では
requestStyleを.conditional、Web ではmediation: "conditional"。error コールバックに従来 upsell ロジックを fallback として保持。
2. 新規プロジェクトでは passkey を唯一のサインイン方式に
- なぜ価値があるか:passkey のみのアカウントはフィッシング不可、忘れにくく、リセットもほぼ不要。セッションはこれが最終目標——フィッシング可能な認証要素の排除——だと明言。
- 始め方:新規ユーザー登録時に passkey を直接作成し、パスワードオプションを提供しない。互換性が本当に必要な場合のみパスワードを代替として提供。
3. Passwords app での Web サイト表示を最適化
- なぜ価値があるか:Passwords app は iOS 18/macOS Sequoia ユーザーのパスワード管理ハブ。良好な表示はブランド認知とアカウント管理を向上。
- 始め方:全ページとサブドメインに正しい OpenGraph メタデータ(
og:site_name)と高解像度アイコン。認証コードサービスはotpauth://リンクでワンタップ設定。
関連セッション
- What’s new in privacy — 権限フローとプライバシー保護データ管理を含むプライバシー更新の概要
- What’s new in location authorization — 位置情報権限 2.0 と新 CLServiceSession 認可診断システム
- Q&A: Passkeys, iCloud Keychain, and authentication services — passkeys、認証サービス、パスワード自動入力に関する Q&A
- Deploy passkeys at work — エンタープライズ環境での passkey デプロイと管理
コメント
GitHub Issues · utterances