ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

雑にTOTPを試してみる

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 との連携

github.com

こういうのがあったが、果たして。