【问题标题】:#<TypeError: no implicit conversion of nil into String> for jwt encoding environment#<TypeError: no implicit conversion of nil into String> for jwt 编码环境
【发布时间】:2019-10-14 20:26:05
【问题描述】:

我收到一个TypeError: no implicit conversion of nil into String,用于我使用“jwt_secret”环境的 encode_token 方法。

我已经确定我的

这是我的应用程序控制器。 encode_token 是有问题的方法,我相信这与我的 jwt_secret env 没有被我的前端客户端识别有关,这是一个向 Rails 数据库发送获取请求的 React 应用程序:

class ApplicationController < ActionController::API
  before_action :authorized, except: [:encode_token, :decoded_token, :logged_in?]

  def encode_token(payload)
    JWT.encode(payload, ENV["jwt_secret"])
  end

  def auth_header
    request.headers['Authorization']
  end

  def decoded_token
    if auth_header()
      token = auth_header.split(' ')[1]
      begin
        JWT.decode(token, ENV["jwt_secret"], true, algorithm: 'HS256')
      rescue JWT::DecodeError
        nil
      end
    end
  end

  def current_user
    if decoded_token()
      user_id = decoded_token[0]['user_id']
      @user = User.find_by(id: user_id)
    else
      nil
    end
  end

  def logged_in?
    !!current_user
  end

  def authorized
    render json: { message: 'Please log in' }, status: :unauthorized unless logged_in?
  end
end

还有我的用户控制器:

class Api::V1::UsersController < ApplicationController
  # before_action :find_user, only: [:show]
  skip_before_action :authorized, only: [:index, :create]

  def index
    @users = User.all
    render json: @users
  end

  def create
    @user = User.create(user_params)
    if @user.valid?
      @token = encode_token(user_id: @user.id)
      render json: { user: UserSerializer.new(@user), jwt: @token }, status: :created
    else
      render json: { error: 'failed to create user' }, status: :not_acceptable
    end
  end

  def show
    @user = User.find_by(id: params[:id])
    render json: @user
  end

end

private

def user_params
  params.require(:user).permit(:username, :password)
end

【问题讨论】:

  • ENV["jwt_secret"] 未定义。它返回nil

标签: ruby-on-rails authentication jwt


【解决方案1】:

您的 ENV["jwt_secret"] 配置似乎有问题。让我们首先通过硬编码值来尝试,将JWT.encode(payload, ENV["jwt_secret"]) 替换为以下行

JWT.encode(payload, "your_secret_key_anything_text")

现在试试,如果它有效,这意味着你的配置文件有问题,它没有得到你的密钥。现在让我们解决问题。让我们尝试一些解决方案。如果您已经设置了 .env 并使用配置,则只需添加以下行

JWT_SECRET='yoursecretkey'
  1. 在您的Gemfile 中添加以下宝石
gem 'dotenv-rails'

没有使用bundle install 来安装这个Gem,你必须在你的.env 文件中指定ENV["jwt_secret"]。

JWT_SECRET='yoursecretkey'

在 Rails 5.2 中,您也可以使用 EDITOR=vim rails credentials:edit 将此变量添加到 secrets 中,整个过程有点复杂,建议查看文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2020-08-19
    • 2020-08-23
    • 2022-11-30
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多