View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • トランスクリプト
  • コード
  • パスキーによるアップグレードと認証情報マネージャによるサインインの効率化

    既存のパスワードベースのアカウントを、パスキーを使用できるように自動でアップグレードする方法を学びましょう。アカウントセキュリティとサインインの容易さを向上させるべき理由とそれを実現する方法、認証情報マネージャアプリ向けの新機能に関する情報、新しいパスワードアプリでご自身のアプリ情報を差別化する方法を紹介します。

    関連する章

    • 0:00 - Introduction
    • 0:38 - Automatic passkey
 upgrades
    • 2:37 - The passkey journey
    • 4:18 - Automatic passkey upgrade sequence
    • 7:46 - Shipping and deploying passkey support
    • 9:17 - Improvements for
 credential managers
    • 10:14 - The new Passwords app!
    • 11:30 - Updating appearance in the Passwords app
    • 12:31 - One-tap verification code setup

    リソース

    • About the security of passkeys
    • ASCredentialProviderExtensionCapabilities
    • Authentication Services
    • Connecting to a service with passkeys
    • Forum: Privacy & Security
    • Passkeys overview
    • Public-Private Key Authentication
    • Supporting passkeys
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC23

    • 組織におけるパスキーの導入

    WWDC22

    • パスキーについて

    WWDC21

    • iCloudキーチェーン認証コードによるセキュアなログイン
  • ダウンロード

    こんにちは Garrettです 今日は皆さんのアプリやWebサイトに パスキーへの自動アップグレードを 実装する方法や 優れたサインイン体験を実現するための 新しい開発の数々をご紹介します このセッションでは 既存のアカウントをパスキーに 自動アップグレードする方法

    認証情報マネージャで使える新機能の数々 新しいパスワードアプリで 皆さんのアプリを差別化する方法を説明します

    最初にご紹介するのは パスキーへの自動アップグレードです

    通常 サインインは 次のような流れで行われます

    まずユーザー名を入力し

    パスワードを入力します

    SMSにコードが届いたら

    これを入力します

    これで やっとサインインできました

    このように Webサイトやアプリに サインインする際は 複数の手順が必要です この方法だと セキュリティは向上しますが 時間がかかって面倒です

    アプリによっては この段階で インタースティシャルアップセルが表示され パスキーなど別の方法で より早く サインインする方法が案内されますが このアプリは 自動的にパスキーに アップグレードされるようになっているので ご覧のように パスキーが作成されたという 通知が表示されています アップセル画面の表示も中断もなく より簡単でセキュアなサインイン体験が スムーズに実現します これはもちろん 皆さんのWebサイトでも可能です

    この体験は さらに強力で安全な サインイン方法に できるだけ簡単かつスムーズに 移行できるようにするためのものです アプリをもう一度開くと 1回タップするだけで 超高速かつ簡単にサインインできます

    この一連の流れを比べてみましょう 最初の手順はまったく同じです

    1つのボタンでアカウントを選択します

    従来のサインインの場合は このあとも手順がいくつかありますが パスキーの場合は手順はこれだけで サインイン完了です しかもパスキーの方がずっと安全です

    フィッシング攻撃などの 認証情報の詐取攻撃は 今日 インターネットでのアカウント侵害の 最も一般的な手口となっています

    最も効果的なフィッシング対策は フィッシングされる要素が一切ない アカウントを設定することです

    新しいアカウントを 保護するための最善の方法は 最初からパスキーを設定することです パスキーなら 忘れることもなく リセットの必要もめったにない上に 1回タップまたはクリックするだけで サインインできます

    パスキーにするだけで フィッシングに対する アカウントの脆弱性を克服できます

    しかし 今日のほぼすべてのアカウントでは フィッシングされる恐れのある パスワードやSMS メール プッシュ通知 有効期限のあるコードしか使われていません

    これらを組み合わせれば 少しは効果的ですが どの要素も基本的には フィッシングに対して脆弱なものばかりです

    今 業界では フィッシング攻撃に 脆弱なサインイン方法から フィッシング不可能なパスキーなどの 認証方法への移行が始まったばかりです

    既存のアカウントで このプロセスを開始するには まず フィッシング不可能なサインイン方法を 代替的な方法として追加します

    このように 段階的に パスキーを導入することで ユーザーが各自のペースで 移行できるようになります

    最終的な目標は フィッシングに脆弱な 認証要素を完全になくすことですが このセッションでは ユーザーができるだけ簡単な方法で スムーズにパスキーを使い始められるよう この最初の第1歩を踏み出すことに 重点を置きます

    これは パスキーへの自動アップグレード のためのシーケンス図です システムはアプリからリクエストを受けると この時点でパスキーを作成するのが 適切かどうかを判断し 適切と判断した場合は 新しいパスキーを返します

    この判断を行うため システムはリクエストを受け取ると 以下を実行します まずシステムは 一連の内部チェックを行って この時点でパスキーを作成するのが 適切かどうか判断します

    例えば デバイスに 認証情報マネージャが設定されており パスキーへの自動アップグレードに 対応しているかどうか

    パスキーの使用に必要なパスコードなどが デバイス上で設定されているかどうか Webでのリクエストの場合は これがプライベートブラウズ以外の タブであることを確認します

    システムは リクエストを受理してよいと判断すると 利用可能な認証情報マネージャに リクエストを渡します 認証情報マネージャにも 独自の受理条件があり 最も重要な条件は 以前にも パスキーを使用して 同じアカウントのユーザー名とパスワードを 入力したことがあったかどうか つまり このアカウントのユーザー名が パスキーと同じかどうかということです

    ユーザー名が同じで 認証情報マネージャの その他の条件も満たしている場合は 新しいパスキーが返され アプリに渡されます

    このプロセスで条件が満たされない場合は エラーが返されますが これは必ずしも 何か問題があるという意味ではなく 今回はパスキーが生成されなかった というだけのことです

    パスキーへの自動アップグレードは 段階的に実装すると考えてください パスキーは リクエストすれば 必ず登録できるとは限りませんが 登録できた場合は アップセル画面が不要になり アプリの操作も中断されず スムーズなユーザー体験が実現します

    これは パスワードによるサインインが 行われた時に パスキーの作成を促す際のフローです

    パスワードを使ってサインインすると アカウントのパスキーの有無がチェックされ ない場合は作成を促します

    現在 多くのアプリでは サインイン後すぐに このようなダイアログが表示され アップグレードが促されます

    パスキーへの自動アップグレードでは このような手順が不要になります この場合は .conditionalという登録用の新しい requestStyleを渡すことができます

    システムとパスキーマネージャの 前提条件を満たしている場合は パスキーが返され パスキーが作成されたという通知が デバイスに表示されます この間 アプリで実行中の操作は 中断されません

    前提条件が満たされないと エラーになり UIは表示されません

    この段階で 既存の アップセルダイアログを表示するか 別の機会にもう一度試すかを選択できます

    Webの場合も同様です 標準のパスキー登録はこのようになりますが

    ここでは mediationの conditionalパラメータによって モーダルでパスキーを作成するリクエストが 自動アップグレードスタイルの リクエストに変更されます

    Webの場合は リクエストスタイルを変更する前に getClientCapabilitiesを使って ブラウザが対応しているかどうか確認します

    業界内で パスワードから パスキーへの移行が進んでいる中 パスキーへの自動アップグレードによって この流れに拍車がかかるでしょう

    アプリやWebサイトのパスキーへのサポートを 提供するプロセスは 他の機能の開発と実装と同じで 「学習」「開発」「テスト」「出荷」の フェーズを辿りますが パスキーの場合は ほかとは少し異なり 最終目標が2つあります 1つ目はサインインを簡単にすること もう1つはアカウントのセキュリティ強化です

    パスキーのサポートを提供することで サインインは大幅に簡単になりますが パスワードとの併用を続けた場合は フィッシング攻撃や パスワードの使い回しを狙った攻撃から 完全に逃れることはできません

    つまり フィッシング可能な 全ての要素を取り除くための サインインのオプションを 検討する時期にあるということです

    皆さんのサービスを利用しているユーザーが パスワードを使用していないなら ぜひ パスワードの排除を検討してください

    同様に ユーザーが多要素認証を使って サインインしている場合は 現在使用されている追加要素のほとんどが 未だフィッシング攻撃に脆弱であり それがパスキーへの移行が進んでいる 根本的な理由であることを忘れないでください

    パスキーを採用することで サービスへのサインインを 大幅に高速化 簡素化できます また 今日の一般的な多要素認証よりも さらに強力なセキュリティ対策を 実現できます

    今すぐパスワードを排除するのは 難しいかもしれませんが これが パスキー実装の最終目標であることを 忘れないでください

    次に 認証情報マネージャで利用可能な 新機能を紹介します

    認証マネージャも パスキーへの 自動アップグレードに対応しています

    それに加えて 有効期限のあるコードを 入力できるようになり

    ユーザー名 パスワード ワンタイムコードも テキストフィールドに入力可能になりました

    これらはすべて 従来の 認証情報マネージャAPIへの追加機能です これらの機能に対応するため Info.plist用の新しいキーと 対応するAPIが用意されています 詳しくは 認証サービスに関する ドキュメントを参照してください

    CredentialProviderExtensionの メカニズムも パスワード パスキー 確認コードに対応するようになり AutoFillを使うアプリを3つまで 選択できるようになっています

    以上が 認証情報マネージャの改良点です

    最後に パスワードアプリについて説明します これはmacOS Sequoia iOS 18 visionOS 2の新機能です

    このアプリでは Webサイトの 名前やアイコンに注目が集まります ぜひ個性を発揮してください Webサイトやアプリの表示を 変更する場合は そのための標準的な方法が 用意されていますので 後ほど説明します

    トップレベルのパスキーのセクションでは フィッシング耐性の高い サインインを採用している アプリやWebサイトがハイライト表示されます 確認コードのセクションもあります 簡単にコードを見つけてコピーできるので まるで専用の認証アプリみたいですね

    セクションには 脆弱なパスワードや使い回しパスワード 漏洩したデータに含まれている 保存済み パスワードのリストが表示されます Well-Known URL for Changing Passwords仕様が採用されている場合は ボタンから パスワード変更用のWebページを開けます

    macOSでは メニューバー項目を有効にしておけば パスワードと確認コードに 素早く簡単にアクセスできます 別の認証情報マネージャから 簡単にパスワードを読み込んだり 読み出すこともできます

    次に パスワードアプリでアカウントが どう表示されるか見てみましょう

    このアカウントには パスキーとパスワードが設定されています

    特定のアプリやWebサイトで 同じユーザー名のパスキーとパスワードが 保存されている場合 パスワードアプリは この2つを 1つのエントリとして統合します

    WebサイトでOpenGraphメタデータ 標準が実装されている場合は アカウントが保存されているサイト名が パスワードアプリに表示されます

    実装されていない場合は パスワードアプリが Webサイト名の取得を試みるか ドメイン名にフォールバックします

    OpenGraphWeb標準を実装すると Webページのヘッダタグに 特定のメタタグを追加して Webサイトのメタデータを宣言できます

    Webサイトが適切に表示されるよう すべてのページ サブドメイン ユーザーエージェントに メタデータが 設定されていることを確認してください

    さらに Webサイトのアイコンが アカウントの横に明確に示されるよう 高解像度のアイコンを用意しましょう

    最後に 有効期限のある確認コードを使う アプリやWebサイトの場合は 標準のQRコードに加えて otpauth:リンクを提供することで ワンタップでコードを 設定できるようになります

    このリンクをタップすると システムの デフォルトの確認コードアプリが起動し 別のデバイスでも 今使っているデバイスでも 簡単にコードを設定できます

    確認コードに使用できる 認証アプリのリストを表示する場合は 「Appleパスワード」も リストに追加してください

    確認コードの詳細については 「Secure login with iCloud Keychain verification codes」をご覧ください

    今後 以下をぜひ実行してみてください パスキーをまだ導入していない方は 今が絶好のタイミングです パスキーはパスワードよりも ずっと速く 簡単でセキュリティも向上します 自動アップグレードによって かつてないほど簡単に この移行が可能になっています

    Webサイトのメタデータを更新し パスワードアプリで Webサイトを差別化しましょう

    最後に 確認コードの設定を効率化して どのデバイスの認証情報マネージャでも スムーズに設定できるようにしましょう

    ご視聴ありがとうございました フィッシング攻撃をなくす取り組みに ご協力いただきありがとうございます

    • 0:01 - Offering a passkey upsell

      // 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 { … }
      }
    • 0:02 - Automatic passkey upgrade

      // 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 { … }
      }
    • 0:03 - Modal passkey creation (web)

      // Modal passkey creation
      
      const options = {
          "publicKey": {
              "rp": { … },
              "user": {
                  "name": userInfo.user,
                  …
              },
              "challenge": …,
              "pubKeyCredParams": [ … ]
          },
      };
      
      await navigator.credentials.create(options);
    • 0:04 - Automatic passkey creation (web)

      // 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);
    • 0:05 - New Credential provider Info.plist keys

      <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>
  • 特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。

    クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。

Developer Footer

  • ビデオ
  • WWDC24
  • パスキーによるアップグレードと認証情報マネージャによるサインインの効率化
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン