Upgraded Rails to 6 along with devise.
After updating for this CSRF error https://github.com/heartcombo/devise/issues/5236 arrived at:
Started POST "/users/auth/twitter" for ::1 at 2022-09-22 21:24:44 -0400
(twitter) Request phase initiated.
(twitter) Authentication failure! undefined method `downcase' for nil:NilClass
"#{u.scheme.downcase}://#{u.host.downcase}#{(u.scheme.casecmp("http").zero? && u.port != 80) || (u.scheme.casecmp("https").zero? && u.port != 443) ? ":#{u.port}" : ""}#{u.path && u.path != "" ? u.path : "/"}"
^^^^^^^^^: NoMethodError, undefined method `downcase' for nil:NilClass
Processing by Users::OmniauthCallbacksController#failure as HTML
Gemfile:
ruby "3.1.0"
gem 'rails', '6.0.3.1'
gem 'devise'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem "omniauth-rails_csrf_protection", "~> 1.0"
link_to for CSRF with POST, previously GET
<%= link_to "Log In" user_twitter_omniauth_authorize_path method: :post, "data-turbo": false %>
In omniauth.rb
OmniAuth.config.allowed_request_methods = [:post]
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def self.provides_callback_for(provider)
class_eval %Q{
def #{provider}
@user = User.find_for_oauth(request.env["omniauth.auth"], current_user)
skip_authorization
authorize @user, policy_class: OmniauthCallbackPolicy
if @user.persisted?
@user.remember_me
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format?
else
session["devise.#{provider}_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
}
end
[:twitter, :facebook, :apple].each do |provider|
provides_callback_for provider
end
def failure
redirect_to root_path
end
end
The line of code that errors our seems to be defined here https://rubydoc.info/gems/oauth/0.5.5/OAuth%2FRequestProxy%2FBase:normalized_uri