如何让 Devise 和 JWT 与我的版本化 API Rails 控制器一起工作?

Posted

技术标签:

【中文标题】如何让 Devise 和 JWT 与我的版本化 API Rails 控制器一起工作?【英文标题】:How do I get Devise and JWT to work with my Versioned API Rails Controller? 【发布时间】:2019-10-12 12:45:51 【问题描述】:

我有一个使用 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】:

好的,我想通了。感觉很hacky,但它有效。这是我将 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

【讨论】:

谢谢。我已经尝试解决此问题两天了,但无济于事!

以上是关于如何让 Devise 和 JWT 与我的版本化 API Rails 控制器一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 JWT 在 Autorest 生成的 SDK 中工作? (ASP.NET 核心 2.0)

从 JSON 在 Devise 中创建用户

使用 Devise 设置会话长度

Rails 4.2 / Devise - 如果禁用cookie,则向用户显示特定消息

使用Devise配置ActionMailer以允许来自不同用户的电子邮件。

如何使用 RSA、AES 和 JWT 进行安全授权?