2要素認証でおなじみのTOTP。Railsなどでどう使えばいいか。雑に試す。
Gemfile
今回はrotpというgemと、二次元バーコード(QRコード、というと商標なのでポリコレな表記をしていr)の表示のためにrqrcode_pngを使う
gem 'rotp' gem 'rqrcode_png'
TOTPを試す
コンソールで:
totp = ROTP::TOTP.new("hogehogefugafuga") #=> #<ROTP::TOTP:0x007fd5fad22850 @digest="sha1", @digits=6, @interval=30, @issuer=nil, @secret="hogehogefugafuga"> totp.now #=> "241886" loop { p Time.now; p totp.now; sleep 1 } 2015-11-27 18:26:50 +0900 "579205" 2015-11-27 18:26:51 +0900 "579205" 2015-11-27 18:26:52 +0900 "579205" 2015-11-27 18:26:53 +0900 "579205" 2015-11-27 18:26:54 +0900 "579205" 2015-11-27 18:26:55 +0900 "579205" 2015-11-27 18:26:56 +0900 "579205" 2015-11-27 18:26:57 +0900 "579205" 2015-11-27 18:26:58 +0900 "579205" 2015-11-27 18:26:59 +0900 "579205" 2015-11-27 18:27:00 +0900 "703388" 2015-11-27 18:27:01 +0900 "703388" 2015-11-27 18:27:02 +0900 "703388" ...
確かに1分単位で変わっている様子がわかる。
これをデバイスに送りつけるための二次元バーコードを生成。
url = totp.provisioning_uri "udzura@auth.udzura.jp" #=> "otpauth://totp/udzura@auth.udzura.jp?secret=hogehogefugafuga" png = RQRCode::QRCode.new(url, size: 10, level: :h).to_img #=> <#ChunkyPNG::Image> png = png.resize(200, 200)
ChunkyPNG、ファイルに書き出さなくても、data URLを吐き出すメソッドを持っているので便利。
png.to_data_url => "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAAEcUlEQVR4nO1Xv27iTBCfjZGW5jB0sWTHlngCOiNZsjue4+Me4DBpaL7YThqaGPIAl3sOOltC8nbUVyCtgyXoYpPGK2H2Wx4A5bT5ytvOGs14/v1mfnPDr70buPb+Sv5/CUdIRbnviY92HjJjmrYqhELZ/7g8SgBSYROcR9jd2RTxk7TXrMVHzktmTu1b5dlrjYkFqfWFHKDVegLrIGFNiOkrpn+ic13CR33DawLvUIxF3tgf6VyT4BOq9DHoQLjSy+gDOOBSaWspCrz162DftQ9aSZwjbgLUkrWGOC/xsMqaEm7hlcHSpirn0h0..."
この画像をGoogle Authenticatorなりなんなりで取り込んで、
loop { p Time.now; p totp.now; sleep 1 }
このループの表示と見比べて満足して今日は終わり。
Devise との連携
こういうのがあったが、果たして。