WWDC Quick Look 💓 By SwiftGGTeam
Streamline sign-in with passkey upgrades and credential managers

Streamline sign-in with passkey upgrades and credential managers

元の動画を見る

ハイライト

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):

  1. システム内部チェック:クレデンシャルマネージャーが設定され、自動アップグレードをサポートしているか?デバイスにパスコードが設定されているか?
  2. Web 固有チェック:プライベートブラウジングタブではないか?
  3. クレデンシャルマネージャー条件:最も重要——そのマネージャーが直前にこのアカウントのユーザー名とパスワードを自動入力したか?

すべての条件を満たせば、システムは新規 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>

キーポイント:

  • ProvidesPasswordsProvidesPasskeys でサポートするクレデンシャルタイプを宣言
  • SupportsConditionalPasskeyRegistration で自動 passkey アップグレードをサポート
  • ProvidesOneTimeCodes でワンタイムコード自動入力
  • ProvidesTextToInsert で任意テキストフィールドへの入力

Passwords app での表示

iOS 18 と macOS Sequoia で新 Passwords app が導入(10:17)。Web サイトと app をより良く表示するには:

  1. OpenGraph メタデータを使用:Passwords app は og:site_name でサイト名を表示
  2. 高解像度アイコンを提供:適切なアイコンファイルを用意
  3. 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:// リンクでワンタップ設定。

関連セッション

コメント

GitHub Issues · utterances