php mail()関数からyaruben.sakura.ne.jpnavigator.credentials.get()navigator.credentials.create() やる勉のログイン方法に、「パスキーでログイン」を追加で実装した。
「パスワードでログイン」から「パスキーでログイン」へ移行できるようにした。
「パスキーでログイン」から「パスワードでログイン」へ逆行はできないようにした。
パスキーとは、FIDO2 規格 に基づいたログイン方式。
FIDO2とは、従来のパスワードを使わずにオンラインサービスにログインできる、安全便利でな認証技術の規格。
パスキーなら、 生体認証(指紋や顔認証)やPINコード(iPhoneなら6桁の画面ロック解除)、「専用のセキュリティキー」などを使用して便利にオンラインサービスにログインできる。
従来のパスワード認証に比べて、パスキーならパスワード漏洩が起きないためフィッシング詐欺や不正アクセスに強い。
近年、パスキーは、 WebAuthn API として WEBブラウザの Javascript に組み込まれた。
弊社の やる勉では、ブラウザ側では WebAuthn API を利用し、サーバ側では、 PHP の "web-auth/webauthn-lib": "5.2.*" ライブラリ を composer.json により 導入して パスキーを実装した。
やる勉では、ユーザの存在確認を ユーザのメールアドレス を用いて行っている。
ユーザ登録の第一段階では、 ユーザの存在確認を行う。つまり、ユーザのメールアドレスの入力が必要である。
やる勉のサーバーから、そのユーザへ、セキュリィティ的に十分な桁数の認証コードを含むメールを送信して、次のユーザ存在確認の画面で、有効期間内に、メールに記載された認証コードを入力させることで、存在確認を行う。
メールアドレスによるユーザの存在確認に成功したら、パスキーをやる勉に登録する。
方法は、 やる勉のサーバーはランダムなチャレンジコードをデバイス(PC, Mac, スマホ)のブラウザに送信し、ブラウザの 「弊社製 Javascript コード」は WebAuthn API で Credential の生成を要求 (navigator.credentials.create() ) 、WebAuthn API はユーザにパスキーや顔認証を要求、ユーザーはパスキーや顔認証でデバイスに許可を命令、デバイスはサーバーサービス固有の秘密鍵と公開鍵のペアを生成し、秘密鍵でチャレンジコードをデジタル署名して 「弊社製 Javascript コード」 まで返す、「弊社製 Javascript コード」は 公開鍵とデジタル署名をやる勉のサーバーに返信、やる勉のサーバーは署名検証してからユーザーの公開鍵を保存。
ユーザが複数のデバイス(PC, Mac, スマホ)を使うのでユーザーの公開鍵は複数登録できるようにしてある。
パスキーによるログイン
まず、やる勉のサーバーは、メールアドレスをユーザーに入力させる。
次に、やる勉のサーバーは、そのユーザメールアドレスが登録されていれば、ランダムなチャレンジコードと公開鍵ID(複数まとめて全部)をブラウザへに送信する。
ブラウザの 、「弊社製 Javascript コード」は WebAuthn API で 認証を要求する (navigator.credentials.get()) 、 WebAuthn API は 公開鍵ID が一致していればユーザにパスキーや顔認証を要求、ユーザーはパスキーや顔認証でデバイスに許可を命令、 デバイスは秘密鍵でチャレンジコードをデジタル署名して 「弊社製 Javascript コード」 まで返す、「弊社製 Javascript コード」はそれをサーバーへ送信、サーバーはあらかじめ保管してある公開鍵でその署名を検証し、一致すればサーバーの本人認証が完了。
やる勉では、万が一のデバイス故障時に備えて、メール認証で別デバイスからログインできるようにした。
残念な点
サブドメイン yaruben.sakura.ne.jp の 親ドメイン sakura.ne.jp が、 gmail.com や yahoo.co.jp から 迷惑メール(SPAMメール)の発信元に認定されているため、 サブドメイン yaruben.sakura.ne.jp からのメールもまた 迷惑メール 扱いされてしまう。
「さくらインターネット」に問い合わせしたが、すぐにはどうしょうもできないとのこと、別に独自ドメインを取るように勧められたが、資金問題と各所への連絡手続きの手間問題で弊社もすぐにはどうしょうもできない。
特に、 gmail.com の迷惑メール防止機能は優れていて、 迷惑メール受信を数時間から半日程度遅延させるように作られている。そのため、「メールアドレスによるユーザの存在確認」が最大一日かかることになる。
暫定対策として、「セキュリィティ的に十分な桁数の認証コード」を10桁とし、認証コード有効期間を25時間とした(一般的な例は 1分間有効で6桁)。また、ユーザ登録の第一段階を数回行っても、認証コード有効期間内であればメールを送信しないようにした。
その他
php mail()関数から メールを送信すると、 メールヘッダーに
「X-Authentication-Warning」が挿入される件
対策として、 PHPMailer による smtp mailer によるメール送信に変更した。
「X-Authentication-Warning」は無くなった、代わりに
「X-Mailer: PHPMailer 7.0.0 (https://github.com/PHPMailer/PHPMailer)」
が挿入されている。
No comments:
Post a Comment