在命名空间内设计路由助手 - warden.authenticate的问题!

时间:2011-07-12 10:13:45

标签: ruby-on-rails ruby-on-rails-3 namespaces devise warden

我通过API登录我的应用程序时遇到问题。我想通过POST / api / v1 / users / sign_in对用户进行身份验证,如果有密码的电子邮件有效,则返回此用户的对象。

的routes.rb

devise_for :users
...
namespace :api do
  namespace :v1 do
    devise_scope :user do
      post 'users' => 'registrations#create', :as => 'user_registration'
      post 'users/sign_in' => 'sessions#create', :as => 'user_session'
    end
  end
end

控制器/ API / V1 / sessions_controller.rb

class Api::V1::SessionsController < Devise::SessionsController
  def create
    resource = warden.authenticate!(:scope => resource_name, :recall => 'api/v1/sessions#failure')
    render :json => resource
  end

  def failure
    render :text => 'not good', :status => 401
  end
end

问题是用户从未经过身份验证。它甚至没有从数据库中选择。这是我的本地服务器日志:

Started POST "/api/v1/users/sign_in" for 127.0.0.1 at Tue Jul 12 11:46:55 +0200 2011
  SQL (0.6ms)  SHOW TABLES
  Processing by Api::V1::SessionsController#create as 
  Parameters: {"user"=>{"password"=>"[FILTERED]", "email"=>"my_email@example.com"}}
Completed   in 1ms
  Processing by Api::V1::SessionsController#failure as 
  Parameters: {"user"=>{"password"=>"[FILTERED]", "email"=>"my_email@example.com"}}
Rendered text template (0.0ms)

我已经尝试使用:scope => :api_v1_user然后为user_v1_api提供POST数据,但这没有帮助。 Sever日志与上面的内容完全相同。

电子邮件和密码绝对正确,因为当我将路径从/api/vi/users/sign_in更改为/users/sign_in时,一切正常,我已登录。

3 个答案:

答案 0 :(得分:1)

问题可能是您没有添加会话控制器来设计路由中的控制器。对于自定义设计控制器的标准实现,它在路由中的devise_for语句中完成:

devise_for :users, :controllers => { :sessions => "user/sessions" }

我不确定您的API的命名空间。我不知道这是否是最佳方式,但也许你可以试试:

devise_for :users, :controllers => { :sessions => "api/v1/user/sessions" }
祝你好运

答案 1 :(得分:0)

你的失败方法是否被称为失败?

对于它,当你调用warden.authenticate时,将'api / v1 / sessions#failure'更改为':failure'!并查看登录是否成功。

答案 2 :(得分:0)

找到这个问题的答案:

devise_for :admins, :class_name => "User"

原帖是Devise Google Group。然后,这将我带到我应该首先看API Docs的地方。洛尔

希望这有帮助!