2012-10-30 55 views
1

我正在使用基於Rails的API。我最近開始試圖對其進行版本化。 (我使用Versionist寶石,萬一它很重要)一個版本('v2')使用Devise和Omniauth通過Facebook/Twitter對用戶進行身份驗證。設置設計omniauth_path_prefix不起作用

我想與此版本相關的所有路由具有相應版本的前綴(所以users/:username/foo變得v2/users/:username/foo等),但我已經發現,把devise_forapi_version塊內防止設計助手(current_useruser_signed_in?等)無法工作,所以它繼續住外塊:

的routes.rb:

devise_for :user, :path => '', :controllers => {:omniauth_callbacks => 'users/omniauth_callbacks'}, :skip => [:registrations, :confirmations, :sessions, :passwords] 

api_version(:module => "V2", :path=>"v2") do 

    resources :authentications, :only => [:update, :destroy] 

    devise_scope :user do 
    post 'login' => 'sessions#create', :as => 'user_session' 
    get 'logout' => 'sessions#destroy' 
    post 'password' => 'devise/passwords#create' 
    put 'password' => 'devise/passwords#update' 
    end 

end 

一切似乎都很大......除了制定產生omniauth路線:

耙路輸出:

user_omniauth_authorize  /auth/:provider(.:format) 
user_omniauth_callback  /auth/:action/callback(.:format) 

現在,一些谷歌福透露,有有一項配置設置,這一點,所以我增加了以下對我們的色器件初始化(config/initializers/devise.rb):

Devise.setup do |config| 
    config.omniauth_path_prefix = 'v2/auth' 
end 

現在,耙路線產生看起來明智的路徑:

user_omniauth_authorize  /v2/auth/:provider(.:format)   v2/users/omniauth_callbacks#passthru {:provider=>/(?!)/} 
user_omniauth_callback  /v2/auth/:action/callback(.:format)   v2/users/omniauth_callbacks#(?-mix:(?!)) 

然而,當我ATTE MPT調用api.localhost/v2/auth/facebook訪問這條路,我得到一個路由錯誤:

ActionController::RoutingError (No route matches [GET] "/v2/auth/facebook") 

任何想法是怎麼回事?

回答

1

您在路線中缺少提供程序名稱,因此它們與/v2/auth/facebook中的facebook部分不匹配。正確的路線目的地應該類似v2/users/omniauth_callbacks#(?-mix:facebook)

您是否在用戶模型中指定了提供者?

devise_for ..., :omniauthable, :omniauth_providers => [:facebook] 

爲了記錄在案,我使用Rails 3.2和3.0設計和更改路線似乎工作(我還沒有進一步的還沒有看到,如果別的東西將打破)。

+0

感謝您的回答。不幸的是,在過去的十個月裏,這個項目已經發生了很大的變化,我無法確定它是否有效。 – MrTheWalrus