Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
49
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OAuthでomniauth-facebookが何をやっているかを見てみた

Posted at

背景

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の継承関係は以下の通り。

Class Diagram.png

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に埋める
  • アプリをコールする

Qiita20140926_omniauth-facebook.jpg

AuthHashはアプリケーションで認証情報やユーザ情報を扱うための情報が入ったhash。
詳細はこちらを参照

クラス図

主な登場人物は

  • application
  • omniauth-facebook (omniauth, omniauth-oauth)
  • oauth2
  • facebook

Qiita20140926_omniauth-facebook_class.jpg

特定のパスへのアクセスをhookしてomniauth-facebookでhook。
omniauth-facebookとFacebookとのやりとりにはoauth2が使われている。
その際のHTTPクライアントはfaraday。
OAuthの基本的な登場人物 (アクセストークン、Authorization Code等)はOAuth2に抽象化されていることが分かる。
AuthHashはomniauthの概念なので、omniauthに定義されている。

49
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?