FIDO2ということで、WebAuthn(Web Authentication)を試してみる

目次

技術評論社 の刊行物である WEB+DB PRESS Vol.107 に Web Authentication の特集が組まれていました。タイミングを合わせたのか、publickeyでも 「Yahoo! JAPANが指紋認証などによるログイン実現。ID/パスワードを不要にするFIDO2対応が国内でついにスタート」という記事が紹介され、日本ではYahoo!さんがプロダクション導入一番手になりそうですね。

現職に転職してからはクライアントサイドの開発に従事する機会が激減し、FIDO の動向をキャッチアップしていなかったのですが、 先程のニュースを見て、「おっ」と思い、久しぶりに手を動かしてみました。

Web AuthenticationとFIDO

簡単に触りだけ説明します。

Web Authentication はW3Cにて策定されたWebにおける認証の仕様です。 主にブラウザに組み込まれることを想定した仕様となっていて、JavascriptのAPIを介して、クライアント側で認証を行います。 従来のID/Passwordによる認証ではなく、携帯電話のPINコードやSMSを使った認証、指紋や顔を使った生体認証の機能が実現できるようになります。

そもそも、Web Authentication の仕様は FIDO Alliance の提案が基になっています。 現在では、 数多くの名だたる企業が加盟している ことから、業界の注目度が高いことが伺えます。

個人的には FIDO という単語を、 所持認証や生体認証を用いてクライアント側で認証処理自体を行う技術、という意味合いで使っています。

Web Authenticationの対応状況

策定された Web Authentication の仕様は、各ブラウザベンダーが実装を進めています。

2018/10現在では、モバイル端末向けのChromeでは近々利用可能という話がある一方、 Webkit(Safari) では In Development(開発中) のステータスです。Safariの対応が完了することで、Webの世界におけるモバイル端末の認証のユーザビリティ向上が本格化しそうですね。

PCブラウザでは、一部のブラウザ(FirefoxやChrome)で既に利用することができます。 その場合には、 Yubico セキュリティキー などのUSBデバイスが必要になります。

指紋認証を試してみる

手持ちのモバイル端末を使って指紋認証を体験してみます。 今回、Android(OS ver7以上)に Chrome Canary をインストールして使うことを前提とします。

実装してみる

WEB+DB PRESS Vol.107 のFIDOの記事で紹介されている サンプルコード は、サーバ通信が発生しないライトな実装だったので、 最初は Web Authentication APIの仕様 を読みながら自前でしこしこ作ろうかと考えていましたが、 既に先人がリファレンス実装をしてくれていました。

上記のリンクから、更に各会社のリファレンス実装のリンクをたどることができます。 今回は、FIDO Allianceが実装している webauthn-demo をベースにしました。

しかし、 webauthn-demo には、 AndroidのChromeで指紋認証を使った場合のアテステーションのハンドリング( fmtandroid-safetynet の場合の実装)がありませんでした。 不足箇所の実装は google/webauthndemo を参考に実装しました。

これをAWSのEC2上に展開し、SSL証明書(ACM)を当てたロードバランサー配下に配置して上げればOKです。

アクセスしてみる

さっそくアクセスしてみましょう。nameusername を入力して Register を押します。

すると、WebAuthn でセキュリティキーの使用を確認する画面が出てくるので 開始 を押します。

どの認証方式を利用するか聞かれるので、指紋認証を選択します。(ここで初めてNFCが使えることを知りました)

端末についている指紋認証センサーに指をあてます。(余談: 画面ロックを使用 ボタンでは、PINコードの入力による認証ができました)

指紋が読み取られ、認証OKになります。

最後にサーバ側で署名を検証すればOKです。 ログインできました。

まとめ

今回はサンプルコードを基に、Web Authentication を試してみました。 既に多くの方がリファレンス実装をしているので、それを参考にすると、かなり工数も削減できそうです。

認証方式の選択時に USB指紋認証 以外にも、 BluetoothNFC も選択可能なことは興味深く、次はこちらも挑戦してみたいです。

従来の認証方式と異なる点として、鍵の所有者が逆転することになりますから、 既にローンチしているサービスにおいては、既存のIDとの共存を設計するところが勘所な気もしますね。

参考