facebookでのログイン、新規登録機能を実装しようとして、新規登録のリンクを押すとターミナル上で以下のエラーが発生します。
Started GET "/users/auth/facebook/callback" for ::1 at 2019-06-29 17:40:29 +0900 I, [2019-06-29T17:40:29.628903 #65658] INFO -- omniauth: (facebook) Callback phase initiated. E, [2019-06-29T17:40:29.629625 #65658] ERROR -- omniauth: (facebook) Authentication failure! no_authorization_code: OmniAuth::Strategies::Facebook::NoAuthorizationCodeError, must pass either a `code` (via URL or by an `fbsr_XXX` signed request cookie) Processing by Users::OmniauthCallbacksController#failure as HTML Redirected to http://localhost:3000/users/sign_in Completed 302 Found in 1ms (ActiveRecord: 0.0ms)
gemfile
1gem 'devise' 2gem "omniauth-rails_csrf_protection" 3gem 'omniauth-facebook'
haml
1= link_to 'Facebookで登録', user_facebook_omniauth_callback_path 2 3※ちなみに 4= render "devise/shared/links" 5にしてクリックするとNot found. Authentication passthru. のエラーが発生
routes
1 devise_for :users, :controllers => { 2 :registrations => 'users/registrations', 3 :sessions => 'users/sessions', 4 :passwords => 'users/passwords', 5 :omniauth_callbacks=> 'users/omniauth_callbacks' 6 }
devise
1config.omniauth :facebook, "~~~~~~~(APPID)", "~~~~~~~~(KEY)"
user
1 devise :database_authenticatable, :registerable, 2 :recoverable, :rememberable, :validatable,:omniauthable 3~~~~ 4 def self.find_for_oauth(auth) 5 user = User.where(uid: auth.uid, provider: auth.provider).first 6 7 unless user 8 user = User.create( 9 uid: auth.uid, 10 provider: auth.provider, 11 email: User.dummy_email(auth), 12 password: Devise.friendly_token[0, 20] 13 ) 14 end 15 16 user 17 end 18 19 private 20 21 def self.dummy_email(auth) 22 "#{auth.uid}-#{auth.provider}@example.com" 23 end
applicationHelper
1 2 def resource_name 3 :user 4 end 5 6 def resource 7 @resource ||= User.new 8 end 9 10 def resource_class 11 User 12 end 13 14 def devise_mapping 15 @devise_mapping ||= Devise.mappings[:user] 16 end 17
omniauthCollbacksController
1 def facebook 2 callback_from :facebook 3 end 4 5 private 6 7 def callback_from(provider) 8 binding.pry 9 provider = provider.to_s 10 @user = User.find_for_oauth(request.env['omniauth.auth']) 11 12 if @user.persisted? 13 flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: provider.capitalize) 14 sign_in_and_redirect @user, event: :authentication 15 else 16 session["devise.#{provider}_data"] = request.env['omniauth.auth'] 17 redirect_to new_user_registration_url 18 end 19 end
コントローラーでbinding.pryが聞かずに、そのままリダイレクトされて新規登録画面に飛んでしまいます。
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。