2012-06-09 27 views
17

Khi tôi bắt đầu khai thác gỗ trong quá trình sử dụng OmniAuth trong một ứng dụng Rails 3, nếu tôi hủy trên trang của nhà cung cấp, tôi được gửi trở lại một URL mà trông giống như sau:Callback từ chối với OmniAuth

http://example.com/auth/twitter/callback?denied=aUho.... 

và ứng dụng của tôi ném một 500, mà tôi có thể thấy đó là một OAuth :: Trái phép: 401 trái phép, mà không bao giờ chạm vào bất kỳ hành động điều khiển của tôi.

Các vết đống là khi tôi tái tạo nó trong máy tính của tôi là:

oauth (0.4.6) lib/oauth/consumer.rb:216:in `token_request' 
oauth (0.4.6) lib/oauth/consumer.rb:136:in `get_request_token' 
omniauth-oauth (1.0.1) lib/omniauth/strategies/oauth.rb:29:in `request_phase' 
omniauth-twitter (0.0.11) lib/omniauth/strategies/twitter.rb:50:in `request_phase' 
omniauth (1.1.0) lib/omniauth/strategy.rb:207:in `request_call' 
omniauth (1.1.0) lib/omniauth/strategy.rb:174:in `call!' 
omniauth (1.1.0) lib/omniauth/strategy.rb:157:in `call' 
omniauth (1.1.0) lib/omniauth/strategy.rb:177:in `call!' 
omniauth (1.1.0) lib/omniauth/strategy.rb:157:in `call' 
omniauth (1.1.0) lib/omniauth/builder.rb:48:in `call' 
sass (3.1.19) lib/sass/plugin/rack.rb:54:in `call' 
warden (1.1.1) lib/warden/manager.rb:35:in `block in call' 
warden (1.1.1) lib/warden/manager.rb:34:in `catch' 
warden (1.1.1) lib/warden/manager.rb:34:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
rack (1.4.1) lib/rack/etag.rb:23:in `call' 
rack (1.4.1) lib/rack/conditionalget.rb:25:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/head.rb:14:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/flash.rb:242:in `call' 
rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context' 
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/cookies.rb:338:in `call' 
activerecord (3.2.6) lib/active_record/query_cache.rb:64:in `call' 
activerecord (3.2.6) lib/active_record/connection_adapters/abstract/connection_pool.rb:473:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call' 
activesupport (3.2.6) lib/active_support/callbacks.rb:405:in `_run__60653626266012267__call__4496837804684830799__callbacks' 
activesupport (3.2.6) lib/active_support/callbacks.rb:405:in `__run_callback' 
activesupport (3.2.6) lib/active_support/callbacks.rb:385:in `_run_call_callbacks' 
activesupport (3.2.6) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.2.6) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/reloader.rb:65:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/remote_ip.rb:31:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' 
railties (3.2.6) lib/rails/rack/logger.rb:26:in `call_app' 
railties (3.2.6) lib/rails/rack/logger.rb:16:in `call' 
quiet_assets (1.0.1) lib/quiet_assets.rb:20:in `call_with_quiet_assets' 
actionpack (3.2.6) lib/action_dispatch/middleware/request_id.rb:22:in `call' 
rack (1.4.1) lib/rack/methodoverride.rb:21:in `call' 
rack (1.4.1) lib/rack/runtime.rb:17:in `call' 
activesupport (3.2.6) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.4.1) lib/rack/lock.rb:15:in `call' 
actionpack (3.2.6) lib/action_dispatch/middleware/static.rb:62:in `call' 
airbrake (3.1.1) lib/airbrake/rack.rb:30:in `call' 
airbrake (3.1.1) lib/airbrake/user_informer.rb:12:in `call' 
railties (3.2.6) lib/rails/engine.rb:479:in `call' 
railties (3.2.6) lib/rails/application.rb:220:in `call' 
rack (1.4.1) lib/rack/content_length.rb:14:in `call' 
railties (3.2.6) lib/rails/rack/log_tailer.rb:17:in `call' 
thin (1.3.1) lib/thin/connection.rb:80:in `block in pre_process' 
thin (1.3.1) lib/thin/connection.rb:78:in `catch' 
thin (1.3.1) lib/thin/connection.rb:78:in `pre_process' 
thin (1.3.1) lib/thin/connection.rb:53:in `process' 
thin (1.3.1) lib/thin/connection.rb:38:in `receive_data' 
eventmachine (0.12.10) lib/eventmachine.rb:256:in `run_machine' 
eventmachine (0.12.10) lib/eventmachine.rb:256:in `run' 
thin (1.3.1) lib/thin/backends/base.rb:61:in `start' 
thin (1.3.1) lib/thin/server.rb:159:in `start' 
rack (1.4.1) lib/rack/handler/thin.rb:13:in `run' 
rack (1.4.1) lib/rack/server.rb:265:in `start' 
railties (3.2.6) lib/rails/commands/server.rb:70:in `start' 
railties (3.2.6) lib/rails/commands.rb:55:in `block in <top (required)>' 
railties (3.2.6) lib/rails/commands.rb:50:in `tap' 
railties (3.2.6) lib/rails/commands.rb:50:in `<top (required)>' 
script/rails:6:in `require' 
script/rails:6:in `<top (required)>' 
-e:1:in `load' 
-e:1:in `<main>' 

Nếu tôi đi về với đăng nhập (mà không cần nhấp hủy tại trang Twitter), sau đó tất cả mọi thứ hoạt động đúng như mong đợi. Tương tự cho Facebook, tôi có thể đăng nhập tốt, nhưng nếu tôi bấm 'hủy' tại trang Facebook, tôi được chuyển hướng trở lại và tôi ném 500.

Có cách nào xử lý tốt hơn không? Tôi muốn có thể hiển thị một trang đẹp.

+2

Nếu đó là 500, vui lòng bao gồm theo dõi ngăn xếp. Nếu đó là 401, điều đó được mong đợi, phải không? – Leopd

+0

Có thể id/mật khẩu ứng dụng twitter của bạn sai hoặc không được gửi tới twitter. – Zabba

+0

@Zabba: id ứng dụng twitter/bí mật là chính xác, họ có thể đăng nhập, sự cố chỉ xảy ra khi họ hủy. Tôi sẽ cập nhật câu hỏi đó. – Pablo

Trả lời

24

Khi có sự cố, phần lớn thời gian tùy thuộc vào loại lỗi, OmniAuth sẽ gọi OmniAuth.config.on_failure theo mặc định được đặt thành OmniAuth::FailureEndpoint. Theo mặc định nó là vụ phải nâng cao một ngoại lệ trong chế độ phát triển và chuyển hướng khác:

def call 
    raise_out! if ENV['RACK_ENV'].to_s == 'development' 
    redirect_to_failure 
end 

Tiêu chí mặc định, theo the docs, là /auth/failure.

Nếu không hoạt động như mong đợi cho bạn, sau đó bạn có thể buộc chuyển hướng đến luôn luôn xảy ra, ngay cả trên chế độ dev, bằng cách thêm này để khởi tạo của bạn:

class SafeFailureEndpoint < OmniAuth::FailureEndpoint 
    def call 
    redirect_to_failure 
    end 
end 

OmniAuth.config.on_failure = SafeFailureEndpoint 

Một giải pháp ngắn gọn hơn từ https://github.com/intridea/omniauth/issues/616

# Added to config/initializers/omniauth.rb 
OmniAuth.config.on_failure = Proc.new { |env| 
    OmniAuth::FailureEndpoint.new(env).redirect_to_failure 
} 
+0

Tôi sẽ kiểm tra liên kết đó và điều tra thêm một chút, nhưng backtrace mà tôi đang hiển thị đến từ sản xuất, chứ không phải dev. – Pablo

+0

Thiết lập ghi nhật ký cho omniauth 'OmniAuth.config.logger = Rails.logger' nó có thể giúp – Josnidhin

+0

Tôi đang thiết lập trình ghi nhật ký, nhưng tôi không chắc chắn cách đó sẽ giúp ích gì. Tôi nhận xét ra dòng trong fail_endpoint rằng sẽ tăng ngoại lệ về phát triển, và tôi vẫn nhận được ngoại lệ tương tự như trước đây, vì vậy đó không phải là nó. – Pablo

6

tôi đã cùng một vấn đề, (facebook hủy nhấp vào)

sau khi thêm

012.
# Added to config/initializers/omniauth.rb 
OmniAuth.config.on_failure = Proc.new { |env| 
    OmniAuth::FailureEndpoint.new(env).redirect_to_failure 
} 

đường callback auth thực hiện như

trong config/routes.rb

match '/auth/failure' => 'sessions#failure' 

điều khiển phiên sẽ trông giống như

class SessionsController < ApplicationController 
    def failure 
    redirect_to #route that you want redirect 
    end 
end 
3

tôi đã cùng một vấn đề, và với giải pháp Pramod của tôi đã nhận được lỗi "Hành động không xác định" nhưng đã hoạt động sau khi tôi đã thay đổi tuyến đường gọi lại thành

config/routes.rb

devise_scope :user do 
    get '/users/auth/failure' => 'sessions#failure' 
end 

Rails 3.2.14
lập mưu 3.1.1
Omniauth 1.1.4

+0

upvote để chỉ định đá quý phiên bản – wizztjh

+0

Cảm ơn bạn rất nhiều vì điều này! – Styledev

0

Đối với những người sử dụng omniauth_facebook và một cái gì đó giống như Users :: OmniauthCallbacksController sử dụng:

cấu hình/tuyến đường.rb

devise_scope :user do 
    get '/omniauth/failure' => 'users/omniauth_callbacks#failure' 
end 

app/controllers/người dùng/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    ... 
    end 
    def failure 
    redirect_to root_path 
    end 
end 

Nếu bạn đang sử dụng FB sổ popup

app/controllers/người dùng/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    ... 
    end 
    def failure 
    if request.env['HTTP_REFERER'] == "https://www.facebook.com/" 
     render 'failure', :layout => false 
    else 
     redirect_to root_path 
    end 
    end 
end 

ứng dụng/lượt xem/người dùng/omniauth_callbacks/failure.html.haml

:javascript 
    window.close(); 
Các vấn đề liên quan