0

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

路线.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然后提供 POST 数据user_v1_api,但这并没有帮助。服务器日志看起来与上面的完全一样。

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

4

3 回答 3

1

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

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

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

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

祝你好运

于 2011-08-15T01:56:30.920 回答
0

你的失败方法曾经被称为失败吗?

更糟糕的是,当您调用warden.authenticate 时,将'api/v1/sessions#failure' 更改为':failure'!并查看是否登录成功。

于 2011-08-23T00:40:16.163 回答
0

找到这个问题的答案:

devise_for :admins, :class_name => "User"

原帖在Devise Google Group上。然后这将我带到我应该首先查看API Docs的地方。哈哈

希望这可以帮助!

于 2012-10-10T21:44:06.247 回答