#<TypeError:对于 jwt 编码环境,没有将 nil 隐式转换为字符串>



我正在使用"jwt_secret"环境收到encode_token方法的TypeError: no implicit conversion of nil into String

我已经确保我的

这是我的应用程序控制器。encode_token是问题方法,我相信这与我的jwt_secret环境未被我的前端客户端识别有关,这是一个向 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"] 配置有问题。让我们首先尝试一下,用以下行替换JWT.encode(payload, ENV["jwt_secret"])

JWT.encode(payload, "your_secret_key_anything_text")

现在尝试,如果它有效,这意味着您的配置文件中有问题并且它没有获得您的密钥。现在让我们解决问题。让我们尝试一些解决方案。如果您已经设置和使用配置.env,而不仅仅是添加以下行

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

安装此 Gembundle install没有用,您必须在 .env 文件中指定 ENV["jwt_secret"]。

JWT_SECRET='yoursecretkey'

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

最新更新