2016-05-14 27 views
0

我有一個omniauth和devise_token_auth的問題。當我嘗試用Facebook註冊用戶時,回調無法正常工作。無法爲用戶找到操作'redirect_callbacks':: OmniauthCallbacksController

她是我的的Gemfile

gem 'rack-cors', :require => 'rack/cors' 
gem 'devise_token_auth' 
gem 'omniauth' 
gem 'omniauth-facebook' 
gem 'devise', '~> 3.2' 

的routes.rb

Rails.application.routes.draw do 
    namespace :api, defaults: { format: :json } do 
     scope :v1 do 
     mount_devise_token_auth_for 'User', at: 'auth', :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } 
     match 'auth/:provider/callback', to: 'sessions#create', via: [:get, :post] 
     end 
    end 
    root to:'welcomes#index' 
end 

這裏的應用程序/控制器/用戶/ omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 

    def failure 
    redirect_to root_path 
    end 
end 

配置/初始化/ omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :facebook, "XXX", "XXX", 
    :scope => 'public_profile,email,user_birthday', 
    :info_fields => 'id,about,birthday,email,first_name,gender,last_name' 
end 

最後,這是控制檯響應:

Started GET "/api/v1/auth/facebook" for 192.168.33.1 at 2016-05-14 10:26:00 +0000 
Cannot render console from 192.168.33.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 


Started GET "/omniauth/facebook?resource_class=User" for 192.168.33.1 at 2016-05-14 10:26:00 +0000 
Cannot render console from 192.168.33.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
I, [2016-05-14T10:26:00.995076 #3226] INFO -- omniauth: (facebook) Request phase initiated. 


Started GET "/omniauth/facebook/callback?code=XXX" for 192.168.33.1 at 2016-05-14 10:26:01 +0000 
Cannot render console from 192.168.33.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
I, [2016-05-14T10:26:01.130357 #3226] INFO -- omniauth: (facebook) Callback phase initiated. 

AbstractController::ActionNotFound (The action 'redirect_callbacks' could not be found for Users::OmniauthCallbacksController): 

我失去了一些東西簡單?我一直在尋找最後幾天的解決方案

回答

1

問題出在您的OmniauthCallbacksController

一種方式是繼承DeviseTokenAuth::OmniauthCallbacksController控制器和掛接到行動:

class Users::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCallbacksController 
    def redirect_callbacks 
     super 
     # some logic here 
    end 
end 

另一種方式是整個控制器codedevise_token_auth寶石複製和解決它們:

module DeviseTokenAuth 
    class OmniauthCallbacksController < DeviseTokenAuth::ApplicationController 

    attr_reader :auth_params 
    skip_before_action :set_user_by_token, raise: false 
    skip_after_action :update_auth_header 

    # intermediary route for successful omniauth authentication. omniauth does 
    # not support multiple models, so we must resort to this terrible hack. 
    def redirect_callbacks 

     # derive target redirect route from 'resource_class' param, which was set 
     # before authentication. 
     devise_mapping = [request.env['omniauth.params']['namespace_name'], 
         request.env['omniauth.params']['resource_class'].underscore.gsub('/', '_')].compact.join('_') 
     redirect_route = "#{request.protocol}#{request.host_with_port}/#{Devise.mappings[devise_mapping.to_sym].fullpath}/#{params[:provider]}/callback" 

     # preserve omniauth info for success route. ignore 'extra' in twitter 
     # auth response to avoid CookieOverflow. 
     session['dta.omniauth.auth'] = request.env['omniauth.auth'].except('extra') 
     session['dta.omniauth.params'] = request.env['omniauth.params'] 

     redirect_to redirect_route 
    end 

    # some code here 

    end 
end 
+0

謝謝 !它工作正常! – Shinix

相關問題