class LifePex::Systems::AuthSystem < Sinatra::Base helpers Sinatra::Cookies include JSON::API include LifePex::UsersHelper def setup_user_cookie!(user_id) response.set_cookie( "auth", { value: JWT.encode({ "user_id" => user_id }, LifePex::SECRET), expires: Time.now + 2.days, path: "/", }) end def renew_user_cookie! response.set_cookie( "auth", { value: cookies["auth"], expires: Time.now + 2.days, path: "/", }) end def user_id_decoded(cookies = nil) cookies = cookies() if cookies.nil? begin decoded = JWT.decode(cookies["auth"], LifePex::SECRET) renew_user_cookie! decoded[0]["user_id"] rescue => err STDERR.puts "user_id_decoded: #{err}" nil end end alias current_user_id user_id_decoded def logged_in? if cookies["auth"] user_id_decoded cookies else nil end end def current_user if @current_user @current_user elsif logged_in? @current_user = LifePex::User.where(id: user_id_decoded(cookies)).first else raise RuntimeError.new "Not connected" end end set(:auth) do condition do unless logged_in? if accept_json? halt 401, { message: 'You need to POST /api/user/v1/register to register an account and POST /api/user/v1/login to get a cookie first' }.to_json else redirect "/login", 303 end end end end end