Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OmniAuthから学ぶOAuth2.0 [Kaigi on Rails 2024]

ykpythemind
October 25, 2024
5k

OmniAuthから学ぶOAuth2.0 [Kaigi on Rails 2024]

Kaigi on Rails 2024の登壇資料です。 GitHub : https://github.com/ykpythemind/kaigi-on-rails-2024

ykpythemind

October 25, 2024
Tweet

Transcript

  1. 3分でわかるOAuth, OpenID Connect 24 OAuth 2.0 Webアプリの認可のためのプロトコル OpenID Connect Webアプリの認証のためのプロトコル

    OAuth2.0 を拡張して作られている The OAuth 2.0 Authorization Framework https://openid-foundation-japan.github.io/rfc6749.ja.html OpenID Connect Core 1.0 https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html
  2. OAuth2ストラテジ の Request Phase を読む 33 ※1 OAuth2.0の文脈で言えば厳密には認可が開始する。 (1) クライアントからIDプロバイダに認証リクエストを送る

    にあたる部分 • リダイレクトなので認証リクエストというイメージがしにくいが、ここから認証が開始 する ※1 • callback_urlは、 http://localhost:4567/auth/google_oauth2/callback が OmniAuthによって自動で設定される https://github.com/omniauth/omniauth-oauth2/blob/c830138e399b207ad3ce832ed4db51e67030cdcb/lib/omniauth/strategies/oauth2.rb#L58
  3. 自前でRequest Phase相当の実装をする 35 • client_id … IDプロバイダに登録したクライアントIDを与えている。 • redirect_uri …

    OmniAuthの例で使ったものと同じ。IDプロバイダに登録したものと一致 する必要がある。 • response_type … 認可コードフローを用いるので “code” を指定する。 • scope … emailやprofileへのアクセスを認可させるかを指定する。 “openid” を指定するとIDトークンがもらえる(OpenID Connectの拡張) 02_request_phase
  4. OAuth2ストラテジ の Callback Phaseを読む 39 https://github.com/omniauth/omniauth-oauth2/blob/c830138e399b207ad3ce832ed4db51e67030cdcb/lib/omniauth/strategies/oauth2.rb#L124 (2) 認証レスポンスが返ってきたらトークンリクエストを送る にあたる部分 •

    get_token() でトークンリクエストを送っている ※1 • “code”というクエリパラメータが認可コード。これは一度限り有効な引換券。 認可コードと引き換えにアクセストークンとIDトークンを得る ※1 実装は OAuth2 gemに委譲 https://gitlab.com/oauth-xx/oauth2/-/blob/main/lib/oauth2/strategy/auth_code.rb#L30
  5. 自前でCallback Phase相当の実装をする 41 (2) 認証レスポンスが返ってきたらトークンリクエストを送る トークンエンドポイントに特定のパラメータをPOSTする • code … クエリパラメータで渡された認可コード

    • client_id … クライアントID • client_secret … クライアントシークレット。クライアント認証のために必要。 (IDプロバイダが、認証済みのクライアントからのリクエストであることを判別する) https://developers.google.com/identity/openid-connect/openid-connect?hl=ja#exchangecode 03_callback_phase
  6. OAuth認証?? 57 omniauth-facebook OAuthだけだとアクセストークンしか得られないため、 そのアクセストークンを用いてユーザー情報APIから user_idを取得している → ユーザー認証を行いたい場合は omniauth/omniauth_openid_connect を使おう

      IDトークンのsubクレームをもとに uid を決定してくれる https://github.com/simi/omniauth-facebook/blob/902971d18b4f43cfb1d969139b4a75bb517a055b/lib/omniauth/strategies/facebook.rb#L59