2013-01-24 24 views
13

我正在構建一個使用Devise gem進行身份驗證的Web應用程序(也帶有API),並且我還使用Doorkeeper gem進行API部分的身份驗證。如何使用Devise和Gatekeeper寶石?

現在的問題是,當我去接收Oauth2代碼(和登錄)的URL時,我被重定向到Web應用程序,而不是客戶端回調URL。

我需要做的是在通常登錄時重定向到Web應用程序,並在使用Oauth時重定向到回調URL。

我該怎麼做?我正在覆蓋Devise會議控制器,但我不知道該如何投入。

這是我的代碼:

def new 
    session[:return_to] = params[:return_to] if params[:return_to] 
    resource = build_resource 
    clean_up_passwords(resource) 
    end 

    def create 
    resource = warden.authenticate!(auth_options) 
    sign_in(resource_name, resource) 
    if session[:return_to] 
     redirect_to session[:return_to] 
     session[:return_to] = nil 
    else 
     respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
    end 

問題是,設計似乎忽略我的重定向邏輯。

請進一步諮詢。

回答

11

假設你的資源是user添加session[:user_return_to] = request.fullpath到resource_owner_authenticator塊

例子:

resource_owner_authenticator do 
    #raise "Please configure doorkeeper resource_owner_authenticator block located in #{__FILE__}" 
    # Put your resource owner authentication logic here. 
    # Example implementation: 
    session[:user_return_to] = request.fullpath 
    current_user || redirect_to(login_url) 
end 
+0

'login_url'可能是'new_user_session_url' –

+0

這給了我一個循環的重定向...請參閱我的答案,我是如何解決它的。 – zmilojko

2

這個工作對我來說,在ApplicationController中(即設計的控制器繼承):

def store_location 
    # store last url as long as it isn't a /users path 
    session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/ 
end 

def after_sign_in_path_for(_resource) 
    session[:previous_url] || root_path 
end 

而且在門衛初始化器中:

resource_owner_authenticator do 
    if user_signed_in? 
    current_user 
    else 
    session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/ 
    redirect_to(new_user_session_path) 
    end 

的想法是記得你在一個會話cookie來的路徑,然後讓設計重定向那裏,當它調用它自己after_sign_in_path_for回調。

Documentation指出resource_return_to會話密鑰,但這對我有效,所以我沒有再檢查。

+0

這可能是由於我用u2f實現了設計,但我的會話[:previous_url]在after_sign_in_path_for中爲空,所以我使用了Cookie而不是會話 – phyzalis

+0

@phyzalis我正面臨類似的問題,您是如何通過cookie解決的? –

+0

我可以通過在'after_sign_in_path_for'中使用super來解決它, 'session [:previous_url] ||超' –