1

我正在开发基于 Rails 的 API。我最近开始尝试对其进行版本控制。(我正在使用Versionist gem,以防万一)一个版本('v2')使用 Devise 和 Omniauth 通过 Facebook/Twitter 对用户进行身份验证。

我希望与此版本关联的所有路由都具有适当的版本前缀(因此users/:username/foo变为v2/users/:username/foo等),但我已经发现放入块devise_for内会api_version阻止 Devise 助手(current_user,user_signed_in?等)工作,所以它继续住在街区外:

路线.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)

现在,一些 google-fu 透露有一个设计配置设置,所以我将以下内容添加到我们的设计初始化程序 ( config/initializers/devise.rb) 中:

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

现在,rake routes 会生成看起来合理的路径:

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:(?!))

但是,当我尝试通过调用来访问此路由时api.localhost/v2/auth/facebook,出现路由错误:

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

知道这里发生了什么吗?

4

1 回答 1

1

您在路由中缺少提供者名称,因此它们facebook/v2/auth/facebook. 正确的路线目的地应该类似于v2/users/omniauth_callbacks#(?-mix:facebook).

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

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

作为记录,我正在使用 Rails 3.2 和 Devise 3.0 并且更改后的路线似乎有效(我还没有进一步查看是否会出现其他问题)。

于 2013-08-21T12:35:52.557 回答