JWT ошибка с методом `verify_expiration ' - PullRequest
0 голосов
/ 24 марта 2020

У меня возник вопрос, когда я пытаюсь использовать JWT для декодирования токена, который отправляется обратно из внешнего интерфейса. Когда токен расшифровывается как «2», который является для меня идентификатором пользователя, чтобы получить пользователя в бэкэнде, я получаю эту ошибку: «NoMethodError: неопределенный метод` include? ' для 2: целое число », которое из следующих кодов в исходных кодах JWT:

def verify_expiration
return unless @payload.include?('exp')
raise(JWT::ExpiredSignature, 'Signature has expired') if @payload['exp'].to_i <= (Time.now.to_i - exp_leeway)
end

Что мне сделать, чтобы это исправить?

мой файл контроллера приложения выглядит следующим образом:

class ApplicationController < ActionController::API

    def encode_token(payload)
        JWT.encode(payload, 'secret')
    end

    def auth_header_token
        request.headers['Authorization'].split(' ')[1]
    end

    def session_user
      binding.pry
      decoded_hash = decoded_token
      if !decoded_hash.empty?
        user_id = decoded_hash[0]["user_id"]
        user = User.find_by :id=>user_id
      end
    end


    def decoded_token
        if auth_header_token
          begin
            JWT.decode(auth_header_token, 'secret',true, algorithm: 'HS256')
          rescue JWT::DecodeError
            []
          end
        end
    end
end

мой session_controller выглядит так:

class SessionController < ApplicationController
    def login
        user = User.find_by :email=>params[:email]
        if user && user.authenticate(params[:password])
            payload = user.id
            token = encode_token(payload)
            render json: {
                user:user, include: ['order', 'favorites','orders.dishes','favorites.dishes'], 
                jwt:token
            }
        else
            render json: {status: "error", message: "We don't find such an user according to your information,please try again."}
        end
    end


    def auto_login
        if session_user
            render json: session_user
        else
            render json: {errors: "No User Logged In."}
        end     
    end
end

Должен ли я изменить способ кодирования user_id?

1 Ответ

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

Только что обнаружил, что проблема в том, что мне нужно кодировать user_id как объект, а не только сам идентификатор, потому что JWT может проверить его как объект, и именно отсюда приходит сообщение об ошибке. Итак, вместо

payload = user.id
token = encode_token(payload)

следует установить:

payload = {user_id: user.id}
token = encode_token(payload)
...