背景
omniauthを使ってFacebookとのOAuthをやってみた、といった記事はネット上にたくさん転がってる。
けど、どうやって実現しているかについて、詳細を解説しているサイトを見かけたことがなかったのでまとめておく。
対象バージョン
- omniauth (1.2.1)
- omniauth-oauth2 (1.1.2)
- omniauth-facebook (1.6.0)
omniauth-facebook
アプリとFacebookとの間に立ってFacebookとのOAuthをしてくれるgem。
中核となるOmniAuth::Strategies::Facebookクラスはrack middlewareになっていて、特定のパスへのアクセスを起点にOAuthのリクエスト開始・Callback処理を行う仕組みになっている。
継承関係
OmniAuth::Strategies::Facebookの継承関係は以下の通り。
OAuthの基本的な機能やrack middlewareとしての機能についてはOmniAuth::Strategyに実装されている。
OAuth2.0に関連する部分はOmniAuth::Strategies::OAuth2に、
Facebookに関わる部分がOmniAuth::Strategies::Facebookに実装されている。
シーケンス
大きく以下の3つのフェーズに分けられる。
ざっくりとしたシーケンスは下図参照。
- FacebookへのOAuthリクエスト (下図 2)
- /users/auth/facebookへのリクエストをフックする
- 必要なパラメータを埋めてFacebookへリダイレクトする
- Facebookでの認証 (下図 3,4)
- 認証・アプリ認可する
- Callback処理 (下図 5)
- Authorization Codeを元にアクセストークン取得
- アクセストークンを使ってユーザ情報取得
- ユーザ情報からAuthHashを生成してenvに埋める
- アプリをコールする
AuthHashはアプリケーションで認証情報やユーザ情報を扱うための情報が入ったhash。
詳細はこちらを参照。
クラス図
主な登場人物は
- application
- omniauth-facebook (omniauth, omniauth-oauth)
- oauth2
特定のパスへのアクセスをhookしてomniauth-facebookでhook。
omniauth-facebookとFacebookとのやりとりにはoauth2が使われている。
その際のHTTPクライアントはfaraday。
OAuthの基本的な登場人物 (アクセストークン、Authorization Code等)はOAuth2に抽象化されていることが分かる。
AuthHashはomniauthの概念なので、omniauthに定義されている。