user_authentication.rb 1020 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # frozen_string_literal: true
  2. require './lib/json_web_token'
  3. module UserAuthentication
  4. extend ActiveSupport::Concern
  5. included do
  6. def current_user
  7. return unless jwt
  8. @current_user ||=
  9. begin
  10. result = JsonWebToken.decode(jwt)
  11. User.find(result.first['id'])
  12. rescue StandardError => e
  13. Rails.logger.error(e.message)
  14. Rails.logger.debug(e.backtrace.join("\n"))
  15. nil
  16. end
  17. end
  18. def current_user=(user)
  19. self.jwt = JsonWebToken.encode(id: user.id, username: user.username)
  20. end
  21. def logged_in?
  22. !current_user.nil?
  23. end
  24. def login(user)
  25. self.current_user = user
  26. end
  27. def logout
  28. cookies.delete(:jwt)
  29. cookies.delete(:_csrf_token)
  30. cookies.delete('x-csrf-token')
  31. end
  32. end
  33. private
  34. def jwt
  35. cookies[:jwt]
  36. end
  37. def jwt=(jwt)
  38. cookies[:jwt] = {
  39. value: jwt,
  40. httponly: true,
  41. secure: !(Rails.env.development? || Rails.env.test?),
  42. }
  43. end
  44. end