昔からomniauthを使っている人にとっては
GET /auth/:provider のエンドポイントにアクセスすることで、
TwitterでのTwitterログインだったり、Facebookログインだったりを実装できるのは当たり前のような話に感じる。
しかし、omniauth2.0からこのエンドポイントのHTTPメソッドがGETではなく、POSTになっていたようである。
これは僕がTwitterログインを含む機能を実装する際に GET /auth/twitter が404になっていたため、気づいたものである。
問題を指摘しているIssue
OmniauthのREADMEでの言及
どうやって対応するか?
上のURLにあるように、
POSTメソッドで/auth/:providerに対してアクセスする必要があるので、各リンク先をPOSTメソッドで送信する形に変更する。
GET /auth/:provider のエンドポイントにアクセスすることで、
TwitterでのTwitterログインだったり、Facebookログインだったりを実装できるのは当たり前のような話に感じる。
しかし、omniauth2.0からこのエンドポイントのHTTPメソッドがGETではなく、POSTになっていたようである。
これは僕がTwitterログインを含む機能を実装する際に GET /auth/twitter が404になっていたため、気づいたものである。
問題を指摘しているIssue
Example to avoid 404 after OmniAuth 2.0 upgrade · Issue #142 · arunagw/omniauth-twitter
Spent some time researching why upgrading broke this login flow. With the CSFR mitigation in 2.0, the GET /auth/twitter endpoint no longer is supported. Adding OmniAuth.config.allowed_request_metho...
OmniauthのREADMEでの言及
omniauth/omniauth
OmniAuth is a flexible authentication system utilizing Rack middleware. - omniauth/omniauth
どうやって対応するか?
omniauth/omniauth
OmniAuth is a flexible authentication system utilizing Rack middleware. - omniauth/omniauth
上のURLにあるように、
POSTメソッドで/auth/:providerに対してアクセスする必要があるので、各リンク先をPOSTメソッドで送信する形に変更する。
link_to 'Sign in via X', '/auth/:provider', method: :post
次に、これだけではCSRF検証に失敗してしまうので、omniauth-rails_csrf_protection というGemをインストールする
cookpad/omniauth-rails_csrf_protection
Provides CSRF protection on OmniAuth request endpoint on Rails application. - cookpad/omniauth-rails_csrf_protection
これらはCSRF検証周りの面倒を見てくれるGemで、OmniauthがこのGemのインストールしての対応を推奨している。
以上で、Omniauthで各種ログインができるようになるはず。
もしTwitterログインをRailsで作ったけどうまく動かない人は、ぜひこの対応を試してみてほしい。