如何使Devise和JWT与我的Versioned API Rails Controller一起使用?

时间:2019-05-26 21:52:04

标签: ruby-on-rails api devise jwt

我有一个使用Devise的Rails API。当您点击POST / login端点时,它将登录用户并提供JWT。直到我最近将控制器版本命名为我的控制器的命名空间,所有这些都工作良好。这是我的session#create方法的样子:

def create
    self.resource = warden.authenticate!(auth_options)

    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?

    render json: current_user
  end

从前端发出登录请求时,我的参数如下所示:

{
    user: {
        email: 'john@gmail.com',
        password: 'password'
    }
}

这以前是可行的,但是现在我已迁移到会话控制器的Api :: V1命名空间,它要求前端在:api_v1_user而不是:user下提交凭据。

有没有一种方法可以更改session#create函数以查看:user属性,而不查看:api_v1_user?

更新

  namespace :api do
namespace :v1 do
    devise_for :users,
       path: '',
       path_names: {
         sign_in: 'login',
         sign_out: 'logout',
         registration: 'signup'
       },
       controllers: {
         sessions: 'api/v1/sessions',
         registrations: 'api/v1/registrations'
       }

1 个答案:

答案 0 :(得分:0)

好吧,我知道了。感觉很hack,但是可以用。这是我将Api :: V1 :: SessionsController创建方法更改为:

  def create
    # Changing scope from :api_v1_user to :user
    Devise.mappings[:user] = Devise.mappings[:api_v1_user]
    warden.config[:default_strategies][:user] =  warden.config[:default_strategies].delete(:api_v1_user)
    auth_opts = auth_options
    auth_opts[:scope] = :user

    self.resource = warden.authenticate!(auth_opts)

    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?

    render json: current_api_v1_user
  end