おふとんの中から

その辺に転がってるエンジニアの備忘録

sorceryを使用した二段階認証を実装した

ゆいなです。

仕事でRailsの認証周りを触ったのですが、あまり見ない組み合わせを使ったのでちょっとブログに書いておこうと思います。

Sorceryに二段階認証を追加する

Sorceryを使っているRailsのシステムに二段階認証を実装してみました。 言ってもとりあえずなんだよってなりそうなので、出てきた言葉からちょこちょこと。

Sorceryって何よ?

Railsで認証周りを取り扱うGem。
https://github.com/Sorcery/sorcery

認証系だとdeviseとかが有名で実装例も多々あるのですが、 sorceryはあんまり使われているところを見たことがないです・・・。

二段階認証って?

通常のログイン処理にプラスした認証のこと。

メールなどで受信して入力するワンタイムパスワードのようなものや、
google authenticatorのようなQRコードをベースにしたコードをアプリケーションに読み込ませてコードを生成するものもある。

どうやって実装したの?

google-authenticator-railsを試してみた - MoneyFoward engineers blog
これを参照しつつ、実装はdeviseで実装しているブログを参考にしながら書きました。

サンプルコードはこちら。
https://github.com/yuina1056/sorcery_twofactor_sample

二段階認証の実装

二段階認証用に別途コントローラーを作成しました。
多分動きはコード見たほうがわかりやすいかな・・・

動作としては、アドレスとパスワードでの認証から二段階認証に情報を渡し、二段階認証時にログイン処理を行う形。 sessions_controllerからuser_mfa_sessionへは一時セッションを使ってアドレスとパスワードを渡してます。

また、初回ログイン時のみQRコードを表示させ、2回目以降は入力欄のみを表示させるようにしています。

特に有効化とかの処理を入れていないのは、この二段階認証を実装したアプリケーションが社内アプリケーションだからw

それにしても、生成されるコードも少なくてsorceryでログイン処理書くとシンプルになりますね。