概要
Facebookとの通信をmockするgemを作ってみたの続き。
FacebookとのOAuthをMockするfacemock-oauthというgemを作ったので紹介。
背景・目的
device + omniauth (omniauth-facebook)でやっているOAuthをMockに差し替えられるようにしたかった。
具体的には、
- devise, omniauthの処理を通過しない
- facemockを使って事前にユーザ登録をしておき、そのユーザでログイン出来る
ようにしたい。
要素技術
- ruby (2.1.1, 2.1.0, 2.0.0, 1.9.3)
- gem (versionはそれぞれ最新を使用)
- rspec
- simplecov
- rack
方針
omniauth, deviseが処理する前にmockでhookして処理させる。
Facebookのログイン画面に相当する画面をmockで返し、認証させる。
deviseとomniauthを使ったFacebookとのOAuthの詳細は多数記事があると思うので詳細は割愛。
ざっくりとした流れ
- WebアプリからFacebookログイン画面へリダイレクトさせる
- Facebookログイン画面が返る
- Facebookで認証・認可する
- WebアプリへCallbackされる
- Callbackで受け取ったAuthorization Codeからアクセストークンを取得する
- アクセストークンを使ってユーザ情報を取得
- ユーザ情報からAuthHashを生成し、ヘッダに載せてCallback用のWebアプリのメソッドを呼ぶ
mockでの流れ
- WebアプリからFacebookログイン画面へのリダイレクトをhookして、mockのログイン画面へリダイレクトさせる
- mockのログイン画面を返す
- mockで認証する
- mockでAuthorization Codeを発行・付与して、WebアプリへCallbackさせる
- CallbackをhookしてAuthorizaton Codeを元にアクセストークンを取得する
- アクセストークンを使ってユーザ情報を取得
- ユーザ情報からAuthHashを生成し、ヘッダに載せてCallback用のWebアプリのメソッドを呼ぶ
実現方法
4つのRackミドルウェアを作成して実現する。
- ログイン画面へのリダイレクトをhookしてmockに流すRackミドルウェア
- ログイン画面を返すRackミドルウェア
- 認証・WebアプリへのCallbackを実現するRackミドルウェア
- WebアプリへのCallbackをhookするRackミドルウェア
やったこと
作ったもの
使い方
付けたバッジ
facemockと同じ。
- Travis Ci : CI
- Coveralls : カバレッジ計測
- Gemnasium : 依存gemの更新状況通知
- Code Climate : コード品質計測
- Version Badge : バージョン表示