具有多个模型和auth标头的devise_token_auth

Arm*_*ndo 8 ruby-on-rails access-token rails-api devise-token-auth

这是我的问题,我为User模型覆盖了控制器:

mount_devise_token_auth_for 'User', at: 'auth', controllers: {
     registrations:      'v1/authentication/registrations'
     sessions:           'v1/authentication/sessions'
     token_validations:  'v1/authentication/token_validations'
 }
Run Code Online (Sandbox Code Playgroud)

这样工作正常,没有问题。但是,当我使用相同的控制器添加新模型时:

mount_devise_token_auth_for 'Admin', 'admin_auth', controllers: {
   sessions:           'v1/authentication/sessions',
   token_validations:  'v1/authentication/token_validations'
}
mount_devise_token_auth_for 'User', at: 'auth', controllers: {
   registrations:      'v1/authentication/registrations',
   sessions:           'v1/authentication/sessions',
   token_validations:  'v1/authentication/token_validations'
}
Run Code Online (Sandbox Code Playgroud)

他们的Admin模型的响应标头没有auth键。响应是ok(200),但不返回auth标头。但是,如果删除Admin模型的控制器部分(替代),则响应将返回auth密钥。顺便说一句,重写仅更改控制器的渲染方法。有什么可以帮助找到解决此问题的方法吗?

Sov*_*ina 8

有关信息,我在这里找到了解决方案并且它有效。

我们需要重写第二个模型的设计令牌身份验证控制器并确定成功响应的范围。

例如,如果第二个用户是Customer

#routes.rb
mount_devise_token_auth_for 'Customer', at: 'customer_auth', controllers: {
  sessions: 'api/v1/customer_auth/sessions',
  registrations: 'api/v1/customer_auth/registrations'
}
Run Code Online (Sandbox Code Playgroud)
# controllers
class Api::V1::CustomerAuth::SessionsController < DeviseTokenAuth::SessionsController
  protected

  def render_create_success
    render json: {
      data: resource_data(resource_json: @resource.token_validation_response)
    }, scope: current_customer
  end
end

class Api::V1::Sps::CustomerAuth::RegistrationsController < DeviseTokenAuth::RegistrationsController
  protected

  def render_create_success
    render json: {
      status: 'success',
      data: resource_data
    }, scope: current_customer
  end
end

Run Code Online (Sandbox Code Playgroud)

事实上,文档谈到了这一点,但我认为它不是很明确。