我通过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
时,一切正常,我已登录。
答案 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的地方。洛尔
希望这有帮助!