2012-05-03 27 views
6

Có ai có thể giúp tôi giải quyết vấn đề này không?Tại sao lệnh gọi Devise + Omniauth không hoạt động?

Tôi đang sử dụng lập mưu + Omniauth trong 3.2 ứng dụng Rails. Những gì tôi muốn biết là, những gì đang xảy ra đằng sau hậu trường với phương pháp user_omniauth_authorize_path(provider) của Devise.

Tôi đã có một cuộc khai quật qua các tuyến đường cào và nguồn của đá quý, nhưng tôi không thể nhìn thấy bất cứ điều gì rõ ràng có thể gây ra vấn đề tôi gặp phải.

tôi giả sử phương pháp này chỉ đơn giản là gọi url signin của nhà cung cấp (ví dụ: Twitter) và sau đó quay trở lại con đường gọi lại theo quy định tại routes.rb.

Trong routes.rb của tôi, tôi có

devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks'} 

devise_scope :user do 
    get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' 
end 

Trong người dùng/omniauth_callbacks_controller.rb Tôi có

def twitter 
    render :text => "This works" 
end 

def passthru 
    render :text => "This doesn't work" 
end 

Trong một cái nhìn Tôi có <%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>. Nhấp vào liên kết này sẽ chuyển đến Twitter nơi tôi có thể đăng nhập nhưng khi trở lại ứng dụng của mình, tôi gặp lỗi "Bạn đã đăng nhập".

Tôi không thể tìm hiểu cách hoặc tại sao lỗi này được tạo. Tôi chỉ nên nhìn thấy "Tác phẩm này" hoặc "Điều này không hoạt động".

Tôi cũng có một nhà cung cấp Facebook thiết lập trong chính xác cùng một cách, và các công trình này như mong đợi.

Nếu tôi thay thế liên kết omniauth lập mưu với <a href="https://stackoverflow.com/users/auth/twitter">Twitter</a> sau đó tôi nhận được: "Đây là công trình".

Vì vậy, điều này giải quyết vấn đề của tôi, nhưng nó không lý tưởng và tôi muốn biết tại sao.

Có ai có thể làm sáng tỏ không?

EDIT

tuyến Rake trông như thế này:

user_omniauth_callback  /users/auth/:action/callback(.:format)      users/omniauth_callbacks#(?-mix:twitter|facebook) 

Trả lời

1

Vâng, nó đang làm việc đối với tôi, vì vậy nó chắc chắn là một cái gì đó trên cuối cùng của bạn. Trước hết, bạn có so sánh trong giao diện điều khiển GET gọi /users/auth/twitter/users/auth/twitter?callback thu được bằng 2 phương pháp khác nhau không? Họ nên xem xét chính xác như nhau (ngoại trừ mã thông báo và trình xác minh, tất nhiên).

Bây giờ, tôi không chắc liệu điều này có liên quan hay không, nhưng với việc nghĩ bạn không sử dụng tuyến đường passthru, vì vậy bạn có thể xóa tuyến đường đó. Thay vào đó, trong bộ điều khiển callbacks của bạn, bạn nên thực hiện một hành động được gọi là thất bại xử lý một yêu cầu xấu. See here để triển khai của nhà phát triển.

Tôi đang nắm tại ống hút ở đây, nhưng bạn cũng nên có điều này ở phần cuối của bộ điều khiển callbacks của bạn:

# This is necessary since Rails 3.0.4 
# See https://github.com/intridea/omniauth/issues/185 
# and http://www.arailsdemo.com/posts/44 
protected 
def handle_unverified_request 
    true 
end 
+0

hi askitaka, cảm ơn vì những lời đề nghị. Tôi đang sử dụng 'passthru' dựa trên các đề xuất https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview và http://stackoverflow.com/questions/5531263/omniauth-doesnt-work-with-route -globbing-in-rails3 wrt route globbing. Điều này không còn được khuyến khích? Dù sao, bạn đã cho tôi một số điều mới để suy nghĩ về. Cảm ơn! Tôi sẽ thử điều này và báo cáo lại. –

+0

hi ashitaka, bạn có thể giải thích ý của bạn bằng cách so sánh các cuộc gọi GET. Tôi đã chạy 'app.get '/ users/auth/twitter'' trong giao diện điều khiển. Cả hai cuộc gọi trở lại '302', đó là để được mong đợi. Có cách nào để kiểm tra các cuộc gọi này chi tiết hơn không? Hoặc theo dõi chuyển hướng 302? –

+0

Doh! Có suy nghĩ về điều này nhiều hơn một chút, bạn là chính xác. Đó là hàm passthru. Tôi đang sử dụng passthru bởi vì tôi có một bắt tất cả trong routes.rb. Trong khi làm việc trên một cái gì đó khác, tôi đã chỉnh sửa chức năng này để hiển thị văn bản theo câu hỏi của tôi. Nhưng mục đích của bộ điều khiển này là trả lại 404 cho các yêu cầu omniauth. Nếu không có hàm passthru, omniauth sẽ không hoạt động. Cảm thấy một chút ngu ngốc bây giờ :) Cảm ơn bạn đã chỉ ra ashitaka này! –

Các vấn đề liên quan