ふとMFAの仕組みがどうなっているのか気になったので暇な時間に調べてみたところ、割とシンプルな仕組みだったので標準ライブラリだけで実装してみた。
ひと口にMFAといってもさまざまな方式があるが、6桁の数字が30秒ごとに切り替わるアレのことを扱う。
コードはGistにアップロードした。
この実装はCLIのアプリケーションとして実際に使用可能で、これを使ってたとえばTwitterにログインできる。
この記事ではその仕組みについて簡単にまとめる。
unix timestamp % 30
を扱うこれで30秒ごとに切り替わる6桁の数値が取れる。
クライアントはこれを表示し、サーバはクライアントから受け取った値と自分で計算した値を比較して認証を行う。
スペックではないが、 QRコードで表されるカスタムURLスキームのフォーマットに関してはGoogle AuthenticatorのGitHub Wiki がデファクトスタンダードとして参照されているようである。