2013-01-24 16 views
13

Tôi đang xây dựng một ứng dụng web (với một API quá) đang sử dụng đá quý Devise để xác thực và tôi cũng sử dụng đá quý Doorkeeper để xác thực cho phần API.Làm thế nào để sử dụng cả đá quý Devise và Doorkeeper?

Vấn đề là khi tôi truy cập URL để nhận mã Oauth2 (và đăng nhập), tôi được chuyển hướng đến ứng dụng web chứ không phải URL gọi lại của khách hàng.

Điều tôi cần làm là chuyển hướng đến ứng dụng web khi đăng nhập bình thường và đến URL gọi lại khi sử dụng Oauth.

Làm thế nào tôi có thể làm điều này? Tôi đang ghi đè lên bộ điều khiển phiên Devise nhưng tôi không biết phải đưa vào điều gì.

Đây là mã của tôi:

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 

Vấn đề là toan tính dường như bỏ qua logic chuyển hướng của tôi.

Vui lòng tham khảo thêm.

Trả lời

11

Giả sử tài nguyên của bạn là user thêm session[:user_return_to] = request.fullpath để resource_owner_authenticator khối

Ví dụ:

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' có thể là 'new_user_session_url' –

+0

điều này đã cho tôi một chuyển hướng vòng tròn ... Xem câu trả lời của tôi về cách tôi đã giải quyết nó. – zmilojko

2

này đã làm việc cho tôi, trong ApplicationController (mà bộ điều khiển lập mưu của kế thừa từ):

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 

Và trong bộ khởi tạo Trình giữ cửa:

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 

cuối

Ý tưởng là để nhớ đường dẫn mà bạn xuất thân từ trong một cookie phiên và sau đó để lập mưu chuyển hướng có khi nó gọi after_sign_in_path_for callback riêng của mình.

Documentation chỉ ra khóa phiên resource_return_to, nhưng điều này làm việc cho tôi vì vậy tôi không kiểm tra nữa.

+0

Đó có thể là do việc triển khai của tôi với u2f nhưng phiên của tôi [: previous_url] trống trong after_sign_in_path_for vì vậy tôi đã sử dụng cookie thay vì phiên – phyzalis

+0

@phyzalis Tôi đang gặp phải sự cố tương tự, cách bạn giải quyết nó bằng cookie? –

+0

Tôi đã có thể nhận được xung quanh nó bằng cách sử dụng siêu trong 'after_sign_in_path_for', ' phiên [: previous_url] || super' –