はじめに
WebAuthn
の勉強をしたいなーと思ったのだが、まずはどういう動作になるのかというのを確認したいので、デモサイトを試してみる。
- awesome-webauthn GitHub
https://github.com/herrjemand/awesome-webauthn?tab=readme-ov-file
上記サイトに多くの素晴らしいデモサイトがまとめてあるので、その中でもPHPのデモをローカルに構築して試してみる。
環境
MacOS Sonoma 14.4.1
Docker version 25.0.3, build 4debf41
Docker Compose version v2.24.6-desktop.1
動作の確認
まずは、以下の2サイトでどのような動作をするかを確かめてみた。
webauthn.io
https://webauthn.io/webauth.me
https://webauthn.me/
仕組み
下記のサイトを読んで理解する。
Introduction to WebAuthn API and Passkey
https://medium.com/webauthnworks/introduction-to-webauthn-api-5fd1fb46c285Guide to WebAuthentication
https://webauthn.guide/
ローカルでデモを動かす
ローカルでWebauthnのデモを動かす時に、下記のデモが良さそうだったのでこれを使う。
https://github.com/web-auth/symfony-webauthn-demo
構築
- Gitクローンでプロジェクトをクローンする
git clone git@github.com:web-auth/symfony-demo.git
Cloning into 'symfony-demo'...
remote: Enumerating objects: 3763, done.
remote: Counting objects: 100% (790/790), done.
remote: Compressing objects: 100% (307/307), done.
remote: Total 3763 (delta 588), reused 629 (delta 453), pack-reused 2973
Receiving objects: 100% (3763/3763), 42.92 MiB | 9.61 MiB/s, done.
Resolving deltas: 100% (2386/2386), done.
- symfony-demoディレクトリに移動する
cd symfony-demo
- ビルドをする
make build
- コンテナ立ち上げ
make up
- プロセスチェック
docker compose ps
でプロセスのチェックをしてみると以下のようになっていた。
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
symfony-demo-database-1 postgres:15-alpine "docker-entrypoint.s…" database 4 minutes ago Up 4 minutes 0.0.0.0:64396->5432/tc
p symfony-demo-mailer-1 schickling/mailcatcher "sh -c 'mailcatcher …" mailer 4 minutes ago Up 4 minutes 0.0.0.0:64397->1025/tc
p, 0.0.0.0:64398->1080/tcp symfony-demo-php-1 app-php "docker-entrypoint f…" php 4 minutes ago Restarting (2) 57 seconds ago
PHPが再起動を続けているので、logs
で確認してみる。
make logs
すると下記のエラーが出ている。
Verifying lock file contents can be installed on current platform.
php-1 | Your lock file does not contain a compatible set of packages. Please run composer update.
php-1 |
php-1 | Problem 1
php-1 | - lcobucci/clock is locked to version 3.1.0 and an update of this package was not requested.
php-1 | - lcobucci/clock 3.1.0 requires php ~8.2.0 -> your php version (8.3.6) does not satisfy that requirement.
php-1 | Problem 2
php-1 | - lcobucci/clock 3.1.0 requires php ~8.2.0 -> your php version (8.3.6) does not satisfy that requirement.
php-1 | - web-auth/metadata-service 4.7.7 requires lcobucci/clock ^2.2|^3.0 -> satisfiable by lcobucci/clock[3.1.0].
php-1 | - web-auth/metadata-service is locked to version 4.7.7 and an update of this package was not requested.
PHP8.3
だと新しすぎるようなので、Dockerfile
をいじってPHP8.2にする。
Dockerfile
の修正
# Versions
-FROM dunglas/frankenphp:latest-alpine AS frankenphp_upstream
+FROM dunglas/frankenphp:latest-php8.2.18-alpine AS frankenphp_upstream
FROM composer/composer:2-bin AS composer_upstream
- 再度ビルドする。
make build
- コンテナ終了&立ち上げ
make down
make up
[+] Running 4/4
✔ Container symfony-demo-database-1 Removed 0.2s
✔ Container symfony-demo-php-1 Re... 0.0s
✔ Container symfony-demo-mailer-1 Removed 0.2s
✔ Network symfony-demo_default Re... 0.1s
[+] Running 3/4
⠇ Network symfony-demo_default Cr... 0.8s
✔ Container symfony-demo-mailer-1 Started 0.6s
✔ Container symfony-demo-database-1 Started 0.7s
✔ Container symfony-demo-php-1 St... 0.7s
docker compose ps
~/workspace/symfony-demo$docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
symfony-demo-database-1 postgres:15-alpine "docker-entrypoint.s…" database 26 seconds ago Up 25 seconds 0.0.0.0:64876->5432/tcp
symfony-demo-mailer-1 schickling/mailcatcher "sh -c 'mailcatcher …" mailer 26 seconds ago Up 25 seconds 0.0.0.0:64874->1025/tcp, 0.0.0.0:64875->1080/tcp
symfony-demo-php-1 app-php "docker-entrypoint f…" php 26 seconds ago Up 25 seconds (health: starting) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:443->443/udp, 2019/tcp
make init
実行
make init
~/workspace/symfony-demo$make init
Database "app" for connection named default already exists. Skipped.
[OK] Already at the latest version ("DoctrineMigrations\Version20230619191051")
- フロントエンドの構築
make frontend
デモサイトへのアクセス
アクセスできたので試してみる。
- 右上の
Login
からログインページへ移動する。 Register now
を 選択する。
Registration form
でUsername
とDisplayname
を適当に入力し、Register
を選択する。
- 「パスキーを作成する」のポップアップが出てくる。
iCloud
キーチェーンで作成する。
TouchID搭載の端末なので、指紋認証でキーチェーンを作成した。
- ログインできる。
再度ログインできるか試す。
- ログアウトし、右上の
Login
を選択する。
- 指紋認証でログインする
ここまででWebauthn
のデモを試した。
参考サイト
ウェブ認証 API
https://developer.mozilla.org/ja/docs/Web/API/Web_Authentication_APIFIDO2:ウェブ認証(WebAuthn)
https://fidoalliance.org/fido2-2/fido2-web-authentication-webauthn/?lang=ja
参考動画
【#38 ネスペ直前対策】FIDO
#15【サクッと学べる支援士対策】FIDO認証
おわりに
自分のサイトにも組み込めるようにさらに勉強していきたい。