Kassy0220 / fjord-minutes

This is an application for taking minutes of fjord-bootcamp's team development.
0 stars 0 forks source link

管理者ユーザーを追加したい #26

Closed Kassy0220 closed 1 month ago

Kassy0220 commented 2 months ago

以下の機能は、管理者(駒形さん町田さん)にのみ実行を許可する必要がある。

駒形さん町田さんのアカウントには、管理者権限を持たせる必要がある。 どのような形で実装するか検討する。

Kassy0220 commented 2 months 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
Kassy0220 commented 1 month ago

上記の問題は、ログインリンクのリクエスト先とHTTPメソッドが誤っていたことが問題だった。 以下のように、/auth/githubにPOSTリクエストを送るようなボタンを作成すると、正しく「リクエストフェーズ」→「コールバックフェーズ」が実行された。

<%= form_tag('/auth/github', method: 'post', data: {turbo: false}) do %>
  <button type='submit'>Login with GitHub</button>
<% end %>

結果として、複数モデルでDeviseのGitHub認証を実装することができた。 以下は注意点。

Kassy0220 commented 1 month ago

管理者ユーザー実装の目処が立ったため、このIssueをクローズします。