ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Web向けのFace IDとTouch IDのご紹介
Face IDやTouch IDはログインの際にスムーズなエクスペリエンスを提供するものですが、Web Authentication APIによってSafariで使用できるようになりました。この便利で安全なログインの新方式をWebサイトに追加する方法をご覧ください。
リソース
関連ビデオ
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ “Web向けのFace IDとTouch IDのご紹介” WebKitチームのジーウェンです Web向けのFace IDとTouch IDについて お話しします このセッションではWebデベロッパ向けに Webサイトに追加可能な新機能を紹介します 早速 始めましょう 私がスマホのアプリケーションを使う中で とても気に入っているのは Face IDやTouch IDを使用してアプリケーションに サインインし直すエクスペリエンスです お気に入りのデモアプリケーション Shinyでお見せしましょう Shinyは日常的に使えて すてきな写真を表示できるアプリケーションです 初めてサインインする時はユーザー名と パスワードを入力する必要があります 私はセキュリティに非常に敏感なので 2要素認証を可能にしました この例では続行するために SMSからのコードを待つ必要があります SMS2要素認証コードを送信すると サインインができ かわいい犬の写真が見れます iOSではAutoFillを使うと サインインが楽になりますが それでも複数のステップや 考えるべきことが多くあります Shinyでは数時間インアクティブのままだと 再度サインインを求められます 高度なセキュリティコンテンツが多くある場合に 同様のポリシーを見かけます 例えば銀行などです しかし今度はサインインの際に パスワードとSMSの2要素認証ではなく Face IDのみを使用します このように一瞬でサインインできます 従来よりも ずっと速く よりセキュアです これをあなたのWebサイトにも 適用する方法をご紹介します 簡単な概略はこうです サインインボタンをクリックすると Safariが確認を要求し すぐにFace IDでサインインできます では Webサイトへの追加方法を 詳しく見ていきましょう Web上のFace IDとTouch IDが実装しているのは Web Authenticationと呼ばれる標準規格です まずその標準について少し触れてから プラットフォーム認証と呼ばれる Appleの実装についてご説明します
次に この新機能を採用するのに 必要なことの基本をお話しします 最後に重要なベストプラクティスを いくつかご紹介します まずはWeb Authentication標準についてです Web AuthenticationはJavaScript APIで WebデベロッパにWeb上で 公開鍵ベースの認証を利用可能にします このAPIは公開鍵暗号を用いて構築されており 多くのユニークな機能を備えています 高レベルのコンセプトから始めましょう 最初に“証明書利用者”と呼ばれる概念に 慣れる必要があります 本質的にはあなたのWebサイトのことです 2番目にAPIは公開鍵認証情報と呼ばれる JavaScriptオブジェクトを生成して利用します そこには認証に必要な情報が すべて含まれています
3番目にすべての秘密鍵は ユーザーのディレクトリではなく 認証器と呼ばれるデバイスで 管理されています 認証器にはセキュリティキーか 今見たようにiPhoneが使えます ユーザーの代わりに Webブラウザが認証器と対話し 認証器からの応答を Webサイトに橋渡しします 4番目に認証器は必要であれば 認証器証明と呼ばれるプロセスを介して その特性を暗号的に証明することができます 聞き慣れない概念かもしれませんが 本セッションを聞けば これらをWebサイトに使えるようになります 使いたくなる理由は何でしょうか
まずWeb Authenticationは公開鍵暗号化による 強力な認証を提供します それはパスワードよりずっと強力で 再利用や破ることはできません さらにフィッシングに耐性があります SafariはこのAPIにより生成された 公開認証情報のみを そのWebサイト内で使用できるようにします 認証情報はそれが作成された認証器から エクスポートすることはできません 公開認証情報が一度作成されたら ユーザーがそれをうっかり他者に 漏らすことはないのです すごいですよね? 以上がWeb Authentication標準の概要です 実際のAPIについては後ほどお話しします 次はFace IDやTouch IDを有効にするため Appleが用意したユニークな機能を紹介します
iPhoneのような認証器は プラットフォーム認証器と呼ばれます 認証器がプラットフォームに 組み込まれているからです Appleの認証器には 重要な特性が2つあります 1つ目は今まで見てきたように Face IDとTouch IDです これはユーザーの同一性の検証に使用されます
2つ目はSecure Enclaveと呼ばれ すべての秘密鍵を管理し それらがデバイスから外へ 出ないことを保証します 両者を組み合わせることで Face IDやTouch IDを用いたサインインは 実質的に多要素認証となります デバイスがWebサイトへ送り返す応答は 2つの要素をカプセル化します あなたが持っているもの つまりiPhoneと あなたが何者か つまり生体認証です しかもタップ1回でサインインできます これはすごいことです しかし銀行のようなWebサイトでは多要素認証を 強要するよう規制される可能性があります 応答に含まれる情報だけでは 不十分かもしれません デバイスが優れた特性を保持していることを メーカーが追加証明する必要があります 認証器証明と呼ばれる 追加のセキュリティ機能でこれを行います 認証器証明とは基本的に デバイスが本物で その機能が確かかどうかを デバイスのメーカーへ問い合わせる セキュアな方法です これは先ほど触れたようなケースで 非常に有益です
しかし実装方法によってはユーザーの プライバシーを侵害する可能性があります 例えば単一で一意の認証器証明の証明書を 使用するようデバイスに指示ができます すると その一意な証明書は 簡単な追跡媒介物になり 認証されたユーザーの全アカウントを Web上でリンクできます Appleはユーザーのプライバシーを守るため 独自の認証器証明サービスを作りました すべての認証情報に対して 一意な証明書を作成するので Webサイトはそれを使って ユーザーの追跡ができなくなります それがApple Anonymous Attestationと 呼ばれるもので まだ利用できませんが もうすぐ登場します こういった豊富な機能により Appleのプラットフォーム認証器は 実にすばらしいものになっています それではWebサイトへの追加方法を 見ていきましょう Webサイトで使用するには 3つのメソッドが必要で すべてpromiseベースのAPIです まず現在のデバイスがこの機能を サポートしているかを確認します PublicKeyCredential.isUserVerifyingPlatform AuthenticatorAvailableを呼ぶことで行えます それからユーザーが使用できるよう設定するため navigator.credentials.createを呼び出し 必要な認証情報を含む PublicKeyCredentialオブジェクトを作成します 最後に ユーザーがサイトにサインインする時に 検証可能な認証情報オブジェクトを返す navigator.credentials.getを呼び出します これでサーバー上で ユーザー認証を行うことができます これらはWeb Authentication APIへの入口です それではどうやってWebサイト上で Face IDやTouch IDを得るのか見てみましょう 機能を検出するのは非常に簡単です PublicKeyCredential.isUserVerifyingPlatform AuthenticatorAvailableを呼ぶだけです ブール値が返され この機能が使用可能かどうか分かります さて今度はユーザーオンボーディングです まずは昔ながらのパスワード資格情報を使い ユーザーにサインインしてもらう必要があります そしてユーザーへ通知文を出します “新機能を使って Face IDかTouch IDを利用すれば” “次回のサインイン時に ユーザー名とパスワードが不要になります” “機能を有効にしますか?” 通知は全画面やバナー フローティングポップアップウィンドウなど Webサイトのスタイルに合わせてください 私が作ったShinyのWebサイトでは 全画面の通知にしました これが通知文です 大体のユーザーは この時点で“OK”を押すでしょう そしたらWeb Authentication APIを使って Touch IDを有効にするために 次のスクリプトをWebサイトに用意します 何よりもまずメソッドにパスするために optionsを構築します 難しそうに見えます しかし分解してみると 実はとても簡単だと分かります 初めに何のWebサイトか書き出します それからユーザーに関する情報です そして何の暗号を利用したいかを明示します ここでは暗号にchallengeを設定します その後 プラットフォーム認証器の利用を ブラウザに設定します これが重要なオプションです 最後は完全に任意です Shinyには特別なセキュリティが いくつか必要なので 認証器証明を選んでいます 簡単でしょう? ではこのoptionsを navigator.credentials.createにパスします するとSafariがUIを処理して PublicKeyCredentialを戻します ユーザーが動かしているイベント内で このメソッドを呼び出すのが重要です 全体の流れをデモで見てみましょう まずは私の資格情報で Shinyにサインインします すると通知が出るので承諾します
Safariは確認UIを表示します OKをクリックしたら Touch IDをして完了です これがユーザーオンボーディングのすべてです すばらしいですが まだ半分です 今のはユーザーが直接関わる部分の エクスペリエンスです レスポンスを処理するために 裏側でまだやることがあります
レスポンスの概要を見てみましょう まず今後特定の資格情報を参照するために 保存すべきIDが書かれています 続いて登録のためのresponseです 利用者を有効にするためにブラウザが生成した メタデータをレスポンスで取得します そして これがレスポンスの要点です attestationObjectには公開鍵のデータと 認証器証明の証明書が含まれています 認証器証明を受け取らない場合はnoneという attestation statementを受け取ります これがレスポンスの概要です サーバーの構成によって コードは難しくなる可能性がありますが 次の確認リストの順番に従ってください 初めにクライアントデータや認証器のデータなど すべてのメタデータを確認します 次に認証器証明を選んだ場合には attestation statementを有効にします 3番目に資格情報や公開鍵データを保存し 今後サインインで使えるようにします 最後に必要に応じて サーバー側のcookieを設定し そのデバイスで特定のアカウントに対して Face IDかTouch IDが可能であることを示します これで再認証の処理がより簡単になります ユーザーオンボーディングに 必要なのはこれだけです ではサインインに移りましょう 登録時にTouch IDを有効にしたアカウントの cookieを保存した場合は それがサインインの最速手段として 記録されています Touch IDを最速手段として使うには 次のスクリプトが必要です
サインインするための公式は 登録の時とよく似ています 他の公開鍵暗号と同様に ここの入力必須項目はchallengeです それから利用予定の正確な資格情報を Safariに登録しておくと便利です そうすればSafariがユーザーに 最適なUIを提供できます 一番重要なのは transportsを明示することです
これらのoptionsを navigator.credentials.getへパスすると SafariはUIを処理し 登録時のように PublicKeyCredentialを戻します ここでもユーザーが利用しているイベント内で このメソッドを呼び出すことが大切です 今の流れをデモで見てみましょう “Sign in”ボタンをクリックすると Safariが確認UIを表示します “Continue”をクリック Touch IDをして完了です こんな簡単にサインイン時に Touch IDを使うことができます 今度は裏側に注目してみます サインインの場合 PublicKeyCredentialの戻り値は少し異なります responseのタイプは AuthenticatorAssertionResponseです このresponseで重要なのはsignatureです すべての公開鍵暗号で signatureを確認する必要があります これがresponseです
サインイン用の確認リストは 登録時のものよりも簡単です まずユーザーIDが確かに ユーザーのうちの1つか検証します それから資格情報IDが そのユーザーIDにひもづくものか確認します それが完了したら 他の全メタデータを検証します 最後に署名を確認します これでユーザーがログインし完了です
以上がWeb上でFace IDとTouch IDを使うために 必要なことでした 3つのポイントを要約します 初めに機能の存在を検出する必要があります 次に典型的な仕組みで ユーザーがサインインした直後に 機能を有効にするか ユーザーに確認する通知文を出します そして今後サインインする際に Face IDかTouch IDを使えるように準備します
Web用のFace IDやTouch IDは Safariで利用可能です macOS iPadOSやiOSのSFSafariViewControllerや ASWebAuthenticationSessionと同様にです 最後に実例を紹介します この機能はサインインの唯一の手段ではなく 代替手段として利用することが何より大切です 秘密鍵はデバイスにひもづいているため Webサイトにサインインする方法が1つだけだと ユーザーはデバイスをなくした時に 永遠にアカウントに入れなくなってしまいます ユーザーエージェント文字列ではなく 機能検出を使って この機能を見つけます
navigator.credentials.createと .getメソッドは ユーザーが動かしている イベント内で呼び出します この機能がデバイスのアカウントに有効かを 示すためにフラグを設定する場合には サーバー側の安全な HttpOnly属性のcookieを利用してください それで長期間保存されます 最後に既にWeb Authenticationを使って セキュリティキーを有効にしたWebサイトに関し セキュリティキーに加えてこの機能を ユーザーに紹介する意味があるか考えるべきです エンドツーエンドのユーザーエクスペリエンスは とても難しいからです
今回はWebで利用する Face IDとTouch IDを紹介しました フリクションレスなユーザーエクスペリエンスや 強力な多要素認証の仕組みが提供されます Webサイトへ容易に統合ができ ユーザーのサインインを簡単にします ユーザーのセッション状態の管理方法を 変更する必要はありません 今日からこの機能を試していただき 潜在的なバグがあれば フィードバックアシスタントか bugs.webkit.orgで教えてください ご視聴ありがとうございました
-
-
7:44 - Feature detection
// Feature detection const isAvailable = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(); if (isAvailable) { // Continue to enrollment or sign in // ... }
-
8:42 - Enrollment
// Enrollment const options = { publicKey: { rp: { name: "example.com" }, user: { name: "john.appleseed@example.com", id: userIdBuffer, displayName: "John Appleseed" }, pubKeyCredParams: [ { type: "public-key", alg: -7 } ], challenge: challengeBuffer, authenticatorSelection: { authenticatorAttachment: "platform" }, attestation: "direct" } }; const publicKeyCredential = await navigator.credentials.create(options);
-
11:42 - Sign in
// Sign in const options = { publicKey: { challenge: challengeBuffer, allowCredentials: [{ type: "public-key", id: credentialIdBuffer, transports: ["internal"] }] } }; const publicKeyCredential = await navigator.credentials.get(options);
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。