Chromeデベロッパーツールを使ってWebAuthnを簡単に試してみよう！

# 概要
こんにちは、すぱりだです。

Chromeのバージョンが87にアップデートされました。
このアップデートである機能のが使えるようになりました。
それがWebAuthnでの認証器(Authenticator)がChrome デベロッパーツールで擬似的に設定できる機能です。
今回はこちらの機能を使って擬似的に作成した認証器を実際に動かすところまでをご紹介したいと思います。

また、今回の説明に関して、FIDO並びにWebAuthnに関してある一定の知識があることを前提に説明させていただくことになります。
FIDOやWebAuthnに関して詳しく知りたい場合は以下のサイトが有効だと思いますのでご参考にされると良いと思います。

- [FIDO Alliancce FIDOの仕組み](https://fidoalliance.org/fido%e3%81%ae%e4%bb%95%e7%b5%84%e3%81%bf/?lang=ja)
- [パスワードの不要な世界はいかにして実現されるのか - FIDO2 と WebAuthn の基本を知る](https://blog.agektmr.com/2019/03/fido-webauthn.html)
- [パスワードレス認証WebAuthnの勘所と対応状況](https://gihyo.jp/dev/column/newyear/2019/webauthn)
- [Sorting FIDO/CTAP/WebAuthn terminologies](https://herrjemand.medium.com/)
- [WebAuthn Overview](https://slides.com/fidoalliance/webauthn-overview)
- [Yahoo! JAPANでの生体認証の取り組み（FIDO2サーバーの仕組みについて）](https://techblog.yahoo.co.jp/advent-calendar-2018/webauthn/)

# 環境
- macOS Big Sur バージョン11.0.1
- Chrome 87.0.4280.67

# デベロッパーツールのWebAuthn機能を使ってみよう！
Chrome上で擬似的に動作する認証器を実際に設定してみましょう。

## 擬似的な認証器の作成方法
まずはChromeの右上にある設定から「その他のツール」 → 「デベロッパーツール」を選択しください。
<img width="400" alt="webauthn1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/0e5090e7-4ac9-0d95-ec9b-af070ce92adc.png">

デベロッパーツールの中にも別の設定アイコンがありますので、そこから「More tools」 → 「WebAuthn」を選択してください。（こちらがChromeのバージョン87から選択できるようになりました！）
<img width="400" alt="webauthn2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/6efaf66f-cad7-bcc4-87c9-5da3dcd4bce6.png">

WebAuthnを選択しますとデベロッパーツールの中に「Enable virtual authenticator environment」のチェックボックスが出てきますのでこれをチェックします。
<img width="400" alt="webauthn3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/a31ca877-08f6-b697-8499-ecf132d67f9e.png">

チェックをしますとChrome上で仮想的に使える新しい認証器を作成することができるようになります。
<img width="400" alt="webauthn4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/62a740dc-2102-e5b5-cecc-9fdbdbee7c07.png">


ここでは認証器を作成するにあたって以下の点を設定することができます。
以下に今回の設定に必要なパラメータに関して軽く説明させていただきます。

- Protocol
    - こちらは「ctap2」と「u2f」の2つを選ぶことができます。ものすごく簡単に説明してしまうと「ctap2」はFIDO2のプロトコルに対応したもので、「u2f」はFIDO2が作られる以前から使われていた「Universal Second Factor」というプロトコルに対応したものになります。WebAuthn自体はFIDO2のプロトコル準拠ですので、WebAuthnの設定をしたい場合は「ctap2」を選ぶのが良いでしょう。
- Transport
    - こちらはどのような接続方法で認証器が接続されているのかを擬似的に設定できる項目で、「usb」、「ble」(Bluetooth Low Energy)、「nfc」、「internal」が用意されています。<br>「usb」、「ble」、「nfc」に関してはパソコンに接続する方法としていろいろなところで目にする機会があると思いますが、「internal」とは何なんでしょうか？<br>
    こちらはデバイス内蔵型の認証器（Platform Authenticator）になります。「internal」を設定することでスマホやパソコンに付属している生体認証を行う認証器から返却される値を擬似的に再現することができます。
- Supports resident keys
    - こちらは認証器内に保存されたアカウント情報と作成したCredentialを紐付けるRegident Keyという機能を有効にするかを設定できます。
- Supports user verification
    - こちらは作成された認証器を使ってログインする際にユーザーの本人確認(生体認証やPINコード入力などのUser Verification)を必要とするかどうかを設定できます。
 

実際に以下のような設定で鍵を作ってみましょう。パラメータを設定したら「Add」を押してみてください。
<img width="400" alt="webauthn4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/753231d0-4145-f998-71b6-49bf21aef45a.png">

「Add」を押すと以下のように設定が反映された認証器を擬似的に生成することができました。
<img width="400" alt="webauthn4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/faac2e1d-f083-95dc-3cda-33bc7b6fd901.png">


## 動作確認
上記でChrome上に擬似的な認証器を作成できたので、CTAP2に対応した認証器を使った認証を実際に試してみましょう！

検証には[Webauthn Codelab](https://webauthn-codelab.glitch.me/)というデバイス内蔵型の認証器を使った再認証のテストができる環境を使ってみたいと思います。
（注：こちらのWebauthn Codelabですが、デバイス内蔵型の認証器(Platform Authenticator)専用のテスト環境なので認証器作成時に「Transport」を「internal」に設定しないと動作テストができない点に気をつけてください）

まずは「username」という欄にテスト用アカウントを入力してユーザー作成を行います。
<kbd><img width="400" border="5" alt="codelab1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/894dc1f1-ad0a-295c-d12e-5c539560920e.png"></kbd>
「NEXT」ボタンを押すとパスワード入力画面が出ますので、今回テスト用に使用するパスワードを入力して「SIGN-IN」ボタンを押してみましょう。
<kbd><img width="400" border="5" alt="codelab2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/fbc894a8-18f0-ef81-e449-8251d1d10a09.png"></kbd>

これによりユーザー作成ができたのでWelcomeページ飛ばされました。
<img width="400" border="5" alt="codelab3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/7f3602ff-7a33-b939-49aa-22a5974ae900.png">

ここでは「No credentials found.」と出ている通り、まだ擬似的に作成した認証器を登録していないのでCredentialがありません。

赤いボタン「ADD A CREDENTIAL」を押して先程作成した認証器を登録し、Credentialを作成してみましょう。
この時、初めてデベロッパーツールのWebAuthnを使う際にChromeから端末に設定しているパスワードを求める場合があります。<br>（注：ここで求められるパスワードは先程ユーザー作成したときに設定したパスワードではないです）<br>
これでCredentialが作成され、擬似的に作成した認証器に紐付けられます。

<img width="400" border="5" alt="codelab4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/f91779a6-eada-6613-c69a-3ab9bf417a0c.png">

Credentialが作成できたのでもう一度デベロッパーツールを見てみましょう。
先程作成した擬似的な認証器に今作成したCredentialが紐付いていることがCredentialsのIDを見ることで確認できます。
<img width="400" border="5" alt="codelab5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/56345dec-3a04-bf7b-4ab5-5d8827377957.png">

Credentialも作成できたので、登録した認証器を使って再認証をしてみましょう。「TRY REAUTH」ボタンを押してみてください。

以下のような再認証画面がでますので、今回は「AUTHENTICATE」ボタンを押してみましょう。
<img width="400" border="5" alt="codelab5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/a146d94b-f78d-60d0-3619-6ba2b88e3cf0.png">

「AUTHENTICATE」ボタンが押されたあとにエラーが出ずにCredentialなどが表示されているWelcomeページに遷移できたら再認証に成功したことになります。<be>（注:今回は擬似的に作成した認証器を使っているので認証時のダイアログなどは出ません）

今回はあくまで擬似的に認証器を作成しているので生体認証などを求めるようなものはなく、本当に認証されているのか体感的にはわかりにくくなっていますが、もう一度デベロッパーツールを見てみましょう。

<img width="400" border="5" alt="codelab5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318280/ae17ea95-bb66-f6a9-7e0b-dbebf2835e75.png">

先程作成したCredentialの「Sign Count」の値が1から2に増えています。「Sign Count」はこのCredentialを使って認証を行った数だけ数字が増えていきます。この数字が増えていくことを確認することで実際に認証が成功していたのかを視覚的にも確認することができます。

# まとめ
ChromeデベロッパーツールにWebAuthnの設定が追加されたので使ってみました。
私もFIDOサーバーなどを作ったことがありますが、サーバーサイドやフロントサイドの動作検証を行うのにセキュリティーキーや生体認証がついたスマホなどの実端末を使わないといけないことが多々ありました。
しかし、このデベロッパーツールを使うことで、擬似的にWebページやサーバーサイドでのWebAuthnの動作確認を簡単にできるようになりました。

今回紹介した機能を使うことでWebAuthnの検証などを行う開発者のデバッグが少しでも改善されると幸いです。

# 参考資料
- [Web Authentication:
An API for accessing Public Key Credentials
Level 1](https://www.w3.org/TR/webauthn/)
- [
Chrome 87 Beta: WebAuthn in DevTools, Pan/Tilt/Zoom, Flow Relative Shorthands and More ](https://blog.chromium.org/2020/10/chrome-87-beta-webauthn-in-devtools.html)
- [FIDO Alliancce FIDOの仕組み](https://fidoalliance.org/fido%e3%81%ae%e4%bb%95%e7%b5%84%e3%81%bf/?lang=ja)
- [パスワードの不要な世界はいかにして実現されるのか - FIDO2 と WebAuthn の基本を知る](https://blog.agektmr.com/2019/03/fido-webauthn.html)
- [パスワードレス認証WebAuthnの勘所と対応状況](https://gihyo.jp/dev/column/newyear/2019/webauthn)
- [Sorting FIDO/CTAP/WebAuthn terminologies](https://herrjemand.medium.com/)
- [WebAuthn Overview](https://slides.com/fidoalliance/webauthn-overview)
- [Yahoo! JAPANでの生体認証の取り組み（FIDO2サーバーの仕組みについて）](https://techblog.yahoo.co.jp/advent-calendar-2018/webauthn/)
- [Webauthn Codelab](https://webauthn-codelab.glitch.me/)