使用 Rails 和 React 时如何在标头中获取 JWT 令牌

Posted

技术标签:

【中文标题】使用 Rails 和 React 时如何在标头中获取 JWT 令牌【英文标题】:How to get JWT token in header when using Rails and React 【发布时间】:2020-05-27 21:52:54 【问题描述】:

我的 Sessions 控制器设置如下。我正在寻找一种方法来从身份验证方法中的 command.result 中获取 auth_token,并在用户登录时使其在我的标头中可用,以便我可以在内部访问它以响应每个请求对用户进行身份验证。

当我向身份验证操作发出请求时,我通过 auth_token 获得了正确的响应,但不知道如何将此响应发送到标头并在那里使用它。

class Api::V1::SessionsController < ApplicationController
  skip_before_action :authenticate_request
  include CurrentUserConcern

  def authenticate
    command = AuthenticateUser.call(params[:email], params[:password])

    if command.success?
      render json:  auth_token: command.result, message: 'Login successful' 
    else
      render json:  error: command.errors , status: :unauthorized
    end
  end

  def create
    user = User.find_by(email: params[:email])
      .try(:authenticate, params[:password])

    if user
      session[:user_id] = user.id
      render json: 
        status: :created,
        logged_in: true,
        user: user,
      

    else
      render json: 
        status: 400,

      , status: 400
    end
  end

  def logged_in
    if @current_user
      render json: 
        logged_in: true,
        user: @current_user
      
    else
      render json: 
        logged_in: false
      
    end
  end

  def logout
    reset_session
    render json:  status: 200, logged_out: true 
  end


end

【问题讨论】:

【参考方案1】:

想通了。

我在控制器中设置了一个 before_action 来设置 @token 变量。这样我就可以在控制器内的任何操作中使用@token。

 class Api::V1::SessionsController < ApplicationController
      skip_before_action :authenticate_request
      before_action :set_token
 end

然后我创建了一个私有方法来设置令牌。

  def set_token
    command = AuthenticateUser.call(params[:email], params[:password])
    if command.success?
      @token = command.result
    else
      nil  
    end
  end

并在我的创建操作中调用@token 变量,将其传递给 set_headers。

response.set_header('token', @token)

【讨论】:

以上是关于使用 Rails 和 React 时如何在标头中获取 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

当客户端未在标头中发送内容长度时,rails v6 如何填充 REQUEST 的内容长度?

如何在 Webpacker 中使用 Rails Url 助手/Rails 5.1 中的 React-rails

如何使用 React 和 Rails 创建表单?

AngularJS和rails cors标头不起作用

如何在 hasura react admin 中动态更新数据提供者标头?

无法解释无效的 CSRF 令牌 rails api