Как исправить ошибку TypeError (без неявного преобразования nil в String): lib/json_web_token.rb:5:in `encode'?

У меня простая Jwt-аутентификация отлично работает в локальной среде, но при загрузке на хероку выдает следующую ошибку!

TypeError (без неявного преобразования nil в String): lib/json_web_token.rb:5:in `encode'

как мне об этом позаботиться?

Это моя библиотека lib/json_web_token.rb

class JsonWebToken
 class << self
   def encode(payload, exp = 24.hours.from_now)
     payload[:exp] = exp.to_i
     JWT.encode(payload, Rails.application.secrets.secret_key_base)
   end

   def decode(token)
     body = JWT.decode(token, Rails.application.secrets.secret_key_base)[0]
     HashWithIndifferentAccess.new body
   rescue
     nil
   end
 end
end

person sandesh b nataraj    schedule 29.07.2019    source источник
comment
Либо полезная нагрузка, либо Rails.application.secrets.secret_key_base равна нулю. В Rails 5.3 Rails.application.secrets.secret_key_base стал Rails.application.credentials.secret_key_base. Используете ли вы одну и ту же версию рельсов локально и на Heroku?   -  person Will    schedule 29.07.2019
comment
Я пробовал с обоими этими утверждениями, но все равно получаю ту же ошибку!   -  person sandesh b nataraj    schedule 29.07.2019
comment
вы можете решить, что является nil, добавив некоторый код, чтобы вызвать более конкретную ошибку, а затем у вас будет больше возможностей для продолжения. что-то вроде: поднять StandardError.new(полезная нагрузка равна нулю), если полезная нагрузка / поднять StandardError.new(секретный ключ равен нулю), если только Rails.application.secrets.secret_key_base. Это не исправит ваш код, но даст более конкретную ошибку.   -  person Will    schedule 29.07.2019


Ответы (2)


Попробуйте так:

require 'jwt'

class JsonWebToken
 def self.encode(payload, expiration = Rails.application.secrets.jwt_expiration_seconds.to_i.seconds.from_now)
   payload = payload.dup
   payload[:exp] = expiration.to_i
   JWT.encode(payload, Rails.application.secrets.hmac_secret_key)
 end

 def self.decode(token)
   JWT.decode(token, Rails.application.secrets.hmac_secret_key)
 rescue JWT::ExpiredSignature, JWT::DecodeError
   false
 end

 def self.decode_to_payload(token)
   decode(token).first.except('exp').with_indifferent_access
 end
end

Надеюсь, это сработает для вас.

person Piyush Awasthi    schedule 29.07.2019

Замените Rails.application.secrets.secret_key_base на ENV['SECRET_KEY_BASE'] в методах encode и decode.

Переменная окружения SECRET_KEY_BASE уже должна быть автоматически установлена ​​Heroku. Вы можете убедиться, что это так, запустив это в CLI:

heroku config:get SECRET_KEY_BASE

Если он не установлен, вы можете сделать это:

heroku config:set SECRET_KEY_BASE=$(rake secret)
person dan-klasson    schedule 14.10.2019