Rails REST Api auth, код ошибки 500 кода в героку, но не в локальной - PullRequest
0 голосов
/ 01 марта 2020

Сделал ROR API с аутентификацией и JWT для подачи приложения реакции. В среде разработки (localhost) все работало нормально. Как только я развернулся к героку, у меня появилась эта ошибка. Я развернул следующие документы по рельсам героку: https://devcenter.heroku.com/articles/getting-started-with-rails5

Когда я пытаюсь «подписаться» или «подписать», запрос не выполняется с кодом состояния 500. Что действительно странно, так это то, что в герою rails console, пользователь создан, но я не получаю свой токен обратно в json. Это вызов из моего приложения реакции:

axios.post('https://hidden-ocean-49877.herokuapp.com/signup', {withCredentials: true,
        name: name, email: email, password: password, password_confirmation: passwordConfirmation})
            .then(response => {
                login(true);
                tokenize(response.data.auth_token);
            }).catch(error => console.log(error));

это журнал в файле heroku:

2020-02-29T21:43:16.041318+00:00 heroku[router]: at=info method=POST path="/signup" host=hidden-ocean-49877.herokuapp.com request_id=7cd577ad-c7c5-4fa7-aa99-91b4b8e49772 fwd="189.214.5.88" dyno=web.1 connect=1ms service=977ms status=500 bytes=421 protocol=https
2020-02-29T21:43:16.038685+00:00 app[web.1]: I, [2020-02-29T21:43:16.038582 #4]  INFO -- : [7cd577ad-c7c5-4fa7-aa99-91b4b8e49772] Completed 500 Internal Server Error in 925ms (ActiveRecord: 29.5ms)
2020-02-29T21:43:16.039125+00:00 app[web.1]: F, [2020-02-29T21:43:16.039063 #4] FATAL -- : [7cd577ad-c7c5-4fa7-aa99-91b4b8e49772]
2020-02-29T21:43:16.039179+00:00 app[web.1]: F, [2020-02-29T21:43:16.039120 #4] FATAL -- : [7cd577ad-c7c5-4fa7-aa99-91b4b8e49772] TypeError (no implicit conversion of nil into String):
2020-02-29T21:43:16.039221+00:00 app[web.1]: F, [2020-02-29T21:43:16.039178 #4] FATAL -- : [7cd577ad-c7c5-4fa7-aa99-91b4b8e49772]
2020-02-29T21:43:16.039264+00:00 app[web.1]: F, [2020-02-29T21:43:16.039226 #4] FATAL -- : [7cd577ad-c7c5-4fa7-aa99-91b4b8e49772] app/lib/json_web_token.rb:9:in `encode'
2020-02-29T21:43:16.039264+00:00 app[web.1]: [7cd577ad-c7c5-4fa7-aa99-91b4b8e49772] app/auth/authenticate_user.rb:9:in `call'
2020-02-29T21:43:16.039264+00:00 app[web.1]: [7cd577ad-c7c5-4fa7-aa99-91b4b8e49772] app/controllers/users_controller.rb:6:in `create'

Файлы, описанные выше, это:

Пользовательский контроллер

class UsersController < ApplicationController
  skip_before_action :authorize_request, only: :create

    def create
        user = User.create!(user_params)
        auth_token = AuthenticateUser.new(user.email, user.password).call
        response = { message: Message.account_created, auth_token: auth_token }
        json_response(response, :created)
      end

      private

      def user_params
        params.permit(
          :name,
          :email,
          :password,
          :password_confirmation
        )
      end
end

в приложении / auth / authenticate_user.rb:

class AuthenticateUser
    def initialize(email, password)
      @email = email
      @password = password
    end

    # Service entry point
    def call
      JsonWebToken.encode(user_id: user.id) if user
    end

    private

    attr_reader :email, :password


    def user
      user = User.find_by(email: email)
      return user if user && user.authenticate(password)
      raise(ExceptionHandler::AuthenticationError, Message.invalid_credentials)
    end
  end

в приложении / lib / json_web_token.rb:

class JsonWebToken
    # secret to encode and decode token
    HMAC_SECRET = Rails.application.secrets.secret_key_base

    def self.encode(payload, exp = 24.hours.from_now)
      # set expiry to 24 hours from creation time
      payload[:exp] = exp.to_i
      # sign token with application secret
      JWT.encode(payload, HMAC_SECRET)
    end

    def self.decode(token)
      # get payload; first index in decoded Array
      body = JWT.decode(token, HMAC_SECRET)[0]
      HashWithIndifferentAccess.new body
      # rescue from all decode errors
    rescue JWT::DecodeError => e
      # raise custom error to be handled by custom handler
      raise ExceptionHandler::InvalidToken, e.message
    end
  end

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Используйте вместо

HMAC_SECRET = Rails.application.secret_key_base

https://github.com/heartcombo/devise/issues/4864

0 голосов
/ 01 марта 2020

Судя по трассировке стека, ошибка происходит в app/lib/json_web_token.rb#9. Я подозреваю, что ошибка происходит в:

HMAC_SECRET = Rails.application.secrets.secret_key_base

, затем возникает ошибка типа в:

JWT.encode(payload, HMAC_SECRET)

Возможно ли, что ваша версия rails использует новый способ для извлечения secret_key_base как описано здесь: Секреты приложений Rails 5.2 пустые в Heroku

Попробуйте запустить Rails.application.secrets.secret_key_base в консоли Prod и посмотрите, вернет ли он что-нибудь.

...