LifePex/src/systems/auth.rb

70 lines
1.5 KiB
Ruby

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