2013-01-24 8 views
13

Buduję też aplikację internetową (z interfejsem API), która korzysta z Devise gem do uwierzytelniania, a także używam klejnotu Doorkeeper do uwierzytelniania części API.Jak używać klejnotów Devise i Doorkeeper?

Problem polega na tym, że kiedy wchodzę na adres URL, aby otrzymać kod Oauth2 (i zalogować się), jestem przekierowywany do aplikacji internetowej, a nie do adresu URL wywołania zwrotnego klienta.

Co muszę zrobić, to przekierować się do aplikacji internetowej podczas logowania się w normalny sposób i do adresu URL zwrotnego podczas korzystania z Oauth.

Jak mogę to zrobić? Nadpisuję kontroler sesji Devise, ale nie wiem, co w nim umieścić.

To jest mój kod:

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 

Problem jest to, że Devise wydaje się ignorować moje logiki przekierowanie.

Proszę o poradę dalej.

Odpowiedz

11

Zakładając, że zasób jest user dodać session[:user_return_to] = request.fullpath do resource_owner_authenticator Blokuj

Przykład:

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' może być' new_user_session_url' –

+0

dało mi to cykliczne przekierowanie ... Zobacz moją odpowiedź na pytanie, jak to rozwiązałem. – zmilojko

2

ten pracował dla mnie, w ApplicationController (czyli kontrolery opracować dziedziczą z):

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 

I w inicjatorze Doorkeeper:

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 

koniec

Chodzi o to, aby zapamiętać ścieżkę pochodzisz w pliku cookie sesji i pozwól Devise przekierować tam, kiedy to wywołuje własną after_sign_in_path_for zwrotnego.

wskazał klucz sesji resource_return_to, ale to zadziałało, więc nie sprawdzałem więcej.

+0

To było może ze względu na moją implementację z u2f, ale moja sesja [: previous_url] była pusta w after_sign_in_path_for więc użyłem ciasteczka zamiast sesji – phyzalis

+0

@phyzalis Mam do czynienia z podobnym problemem, jak rozwiązałeś go z ciasteczkami? –

+0

Udało mi się ominąć to, używając super w 'after_sign_in_path_for', ' session [: previous_url] || super' –

Powiązane problemy