#для среды кодирования jwt - PullRequest
0 голосов
/ 14 октября 2019

Я получаю TypeError: no implicit conversion of nil into String для моего метода encode_token с использованием среды "jwt_secret".

Я убедился, что мой

Вот мой ApplicationController. Кодовый_код является проблемным методом, и я считаю, что это связано с тем, что мой jwt_secret env не распознается моим клиентом переднего плана, который является приложением React, которое отправляет запрос на выборку в базу данных Rails:

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

1 Ответ

0 голосов
/ 15 октября 2019

Похоже, у вас проблема с вашей конфигурацией 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 ["jwt_secret"] в вашем файле .env.

JWT_SECRET='yoursecretkey'

в Rails 5.2 вы можете использовать EDITOR=vim rails credentials:edit, чтобы добавить эту переменную в секретыКроме того, весь этот процесс немного сложнее, чтобы предложить проверить документацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...