【问题标题】:Devise route helpers inside namespace - problem with warden.authenticate!在命名空间内设计路由助手 -warden.authenticate 的问题!
【发布时间】:2011-10-03 12:05:56
【问题描述】:

我在通过 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

controllers/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 =&gt; :api_v1_user,然后为user_v1_api 提供POST 数据,但这没有帮助。服务器日志看起来与上面的完全一样。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    祝你好运

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        找到这个问题的答案:

        devise_for :admins, :class_name => "User"
        

        原始帖子位于Devise Google Group。然后,这将我带到了我应该首先查看的地方 API Docs。哈哈

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-25
          • 2017-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多