Closed Kassy0220 closed 1 month ago
Devise + omniauthable でOAuthを実装している場合、一つのモデルしかOAuthを利用することができない。 複数モデルでGitHub認証を実装する方法が以下のWikiで紹介されている。 How to Setup Multiple Devise User Models · heartcombo/devise Wiki
しかし、上記のWikiのコードをRailsアプリに追加すると、GitHub認証自体がうまくいかなかった。 通常のGitHub認証では、「リクエストフェーズ」→「コールバックフェーズ」の順で処理が進むが、Wikiのコードでは「リクエストフェーズ」が実行されず、いきなり「コールバックフェーズ」が実行されて、エラーが発生している。
(失敗した時のログ)
09:22:41 web.1 | Started GET "/members/auth/github/callback" for ::1 at 2024-09-04 09:22:41 +0900
09:22:41 web.1 | D, [2024-09-04T09:22:41.403939 #88959] DEBUG -- omniauth: (github) Callback phase initiated.
09:22:41 web.1 | E, [2024-09-04T09:22:41.404406 #88959] ERROR -- omniauth: (github) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
09:22:41 web.1 | Processing by AuthenticationsController#failure as HTML
09:22:41 web.1 | [Devise] Could not find devise mapping for path "/members/auth/github/callback".
(成功した時のログ)
19:49:13 web.1 | Started POST "/members/auth/github?course_id=2" for 127.0.0.1 at 2024-09-03 19:49:13 +0900
19:49:13 web.1 | D, [2024-09-03T19:49:13.952724 #15154] DEBUG -- omniauth: (github) Request phase initiated.
19:49:14 web.1 | Started GET "/members/auth/github/callback?code=28a98b526c66facfa4dc&state=113cc5f6f64ada8d45839b06c49b572485259b6b28ade6c8" for 127.0.0.1 at 2024-09-03 19:49:14 +0900
19:49:14 web.1 | D, [2024-09-03T19:49:14.539381 #15154] DEBUG -- omniauth: (github) Callback phase initiated.
19:49:15 web.1 | Processing by Members::OmniauthCallbacksController#github as HTML
上記の問題は、ログインリンクのリクエスト先とHTTPメソッドが誤っていたことが問題だった。
以下のように、/auth/github
にPOSTリクエストを送るようなボタンを作成すると、正しく「リクエストフェーズ」→「コールバックフェーズ」が実行された。
<%= form_tag('/auth/github', method: 'post', data: {turbo: false}) do %>
<button type='submit'>Login with GitHub</button>
<% end %>
結果として、複数モデルでDeviseのGitHub認証を実装することができた。 以下は注意点。
devise_gruop
を利用する
<%= form_tag("/auth/github?course_id=#{course.id}", method: 'post', data: {turbo: false}) do %>
:skip
オプションを指定する
devise_for :admins, skip: :all
管理者ユーザー実装の目処が立ったため、このIssueをクローズします。
以下の機能は、管理者(駒形さん町田さん)にのみ実行を許可する必要がある。
駒形さん町田さんのアカウントには、管理者権限を持たせる必要がある。 どのような形で実装するか検討する。