70 lines
1.5 KiB
Ruby
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
|