ruby on rails - Why is current_user called on render in controller? -


i'm getting following error when trying access log in method of sessions controller:

jwt::decodeerror (nil json web token):  lib/json_web_token.rb:11:in `decode' app/helpers/sessions_helper.rb:15:in `current_user' app/controllers/api/sessions_controller.rb:11:in `create' 

if comment out render json: user in controller response, good, except need respond user...why on earth current_user method called on through line 11 of sessions_controller.rb. here's relevant code:

lib/json_web_token.rb

require 'jwt'  class jsonwebtoken   def self.encode(payload, expiration = 24.hours.from_now)     payload = payload.dup     payload['exp'] = expiration.to_i     jwt.encode(payload, rails.application.secrets.json_web_token_secret)   end    def self.decode(token)     jwt.decode(token, rails.application.secrets.json_web_token_secret).first   end end 

sessions_helper.rb

require 'json_web_token'  module sessionshelper   def create_session(user)     session[:user_id] = user.id   end    def current_user     auth_token = request.headers["authorization"]     if auth_token       auth_token = auth_token.split(" ").last       begin         decoded_token = jsonwebtoken.decode auth_token       rescue jwt::expiredsignature         return       end       @current_user ||= user.find_by(auth_token: auth_token)     end   end    def log_out(user)     logged_in? ? user.generate_authentication_token! : user.destroy_token!     auth_token = user.auth_token     user.update_attribute(:auth_token, auth_token)   end    def logged_in?     current_user.present?   end    def authenticate_with_token!     render json: { errors: "not authenticated" }, status: :unauthorized unless logged_in?   end    def log_in(user)     create_session(user)     user.generate_authentication_token!     user.update_attribute(:auth_token, user.auth_token)   end    def authenticate_as_self_or_admin!     render json: { errors: "not authorized" }, status: :unauthorized unless is_self? || is_admin?   end    def is_self?     user = user.find(params[:id])     auth_token = request.headers["authorization"]     auth_token = auth_token.split(" ").last if auth_token     user.auth_token != auth_token   end    def is_admin?     if logged_in? && current_user.authenticate(params[:password])       current_user.admin     end   end end 

sessions_controller.rb

class api::sessionscontroller < applicationcontroller   before_action :authenticate_with_token!, only: [:destroy]   def new   end    def create     user = user.find_by(email: params[:session][:email].downcase)      if user && user.authenticate(params[:session][:password])       log_in user       render json: user, status: :created     else       render json: user, status: :unprocessable_entity     end   end    def destroy     log_out current_user     render status: 204   end end 

user.rb

require 'json_web_token'  class user < applicationrecord   attr_reader :current_password    before_save { email.downcase! }   before_create :generate_authentication_token!   before_update :reset_confirmed!, :if => :email_changed?   has_secure_password   has_many :posts   has_many :comments   has_many :votes   valid_email_regex = /\a[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i   validates :email, presence: true, length: { maximum: 255 }, format: { with: valid_email_regex }, uniqueness: { case_sensitive: false }   validates :username, presence: true, length: { maximum: 24 }, uniqueness: { case_sensitive: false }   validates :password, presence: true, length: { minimum: 8 }   validates :auth_token, uniqueness: true    def generate_authentication_token!     begin       self.auth_token = jsonwebtoken.encode('id' => self.id, 'username' => self.username, 'email' => self.email, 'bio' => self.bio, 'confirmed' => self.confirmed, 'admin' => self.admin, 'points' => self.points)     end while self.class.exists?(auth_token: auth_token)   end    def destroy_token!     self.auth_token = nil   end    def reset_confirmed!     self.confirmed = false   end    def upvotes     self.votes.where(polarity: 1)   end    def downvotes     self.votes.where(polarity: -1)   end    def update_with_password(user_params)     current_password = user_params.delete(:current_password)     user_params[:password] = current_password if user_params[:password].nil?      if self.authenticate(current_password)       self.update(user_params)     else       self.errors.add(:current_password, current_password.blank? ? :blank : :invalid)       false     end   end end 

no, not using devise. i'm hoping eyes tired here...

it turns out current_user in fact being called since default scope_name active model serializers. changed name of current_user method avoid conflict. here relevant docs.


Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -