Railsでワンタイムパスワードによる認証を行うGemを作りました

Railsでワンタイムパスワードによる認証を行うonetimepasswordというGemを作りました。

4桁や6桁の数字の認証コードを入力して認証するあれです。

https://rubygems.org/gems/one_time_password

https://github.com/yosipy/one_time_password

近い道としては「2段階認証」や「新規会員登録時のメール認証でアカウントを有効化すること」などを想定してます。

新規会員登録の時に認証URLをメールで送ってアクセスしてもらうタイプが多いと思うのですが、この方式だとモバイルアプリの時にアカウントを有効化した後に再度ログインしてもらうなどしてもらわないといけなくて不便ですよね。

今回作ったようなワンタイムパスワード方式ならそのあたりの実装をシンプルにできます。

そんなこともあってキャンプから帰ってきてコツコツ3週間くらいで作ってリリースしました。

公開した後、rubygems.orgのReleaseに掲載されるので1日で150以上ダウンロードしてもらえて驚きました。

そこそこ頑張って作ったので見てみてもらえると普通にうれしいですし、スターもらえると号泣するほどうれしいです。

せっかくなので作ったGemの説明

会員登録の場合、シーケンス図はこんな感じで、ユーザーがワンタイムパスワードを発行するリクエストをして、メールで送られてきた認証コードとユーザー情報を送ることで会員登録できます。

認証コードを発行したときからclient_tokenを発行して、このtokenでユーザーが正しいか判定しています。

sequencediagram

ワンタイムパスワードである認証コードですが、念のためハッシュ化して漏れないようにしています。

また、アプリケーションレベルで一定時間に一定数間違えると、認証コードの生成をできないようにする機能なんかも作ってます。

rack-attack gemと組み合わせて2重で対策するのがセキュアだと思います。

まとめ

今回はGem作ったよってだけの記事なのでこの辺で。

初めてGemを作ったんですが割と楽しかったです。

Railsの機能に依存したGemを作る場合はRails Pluginとして作ったほうがかなり楽だと思います。

僕は最初Rails Pluginというものを知らなかったので、途中で作り直しました。

この辺の知見もそのうち別の記事にまとめたいですね。

あと、ドキュメント書いてるときに思ったけど英語がダメですね。

僕の英語力はアンダーバーが和製英語なのを知ってるのが関の山なので、もうちょい頑張らないと。。。

読んでくれてShank you. Give mi a sutar, please.

https://github.com/yosipy/one_time_password