json_web_token.rb 810 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. # frozen_string_literal: true
  2. require 'jwt'
  3. class JsonWebToken
  4. ALG = 'HS384'
  5. ISS = 'https://pokemon.trade/'
  6. AUD = 'pk.t'
  7. Error = Class.new(StandardError)
  8. def self.encode(payload)
  9. data = payload.reverse_merge(meta)
  10. JWT.encode(
  11. data,
  12. Rails.application.credentials.jwt_secret,
  13. ALG,
  14. )
  15. end
  16. def self.decode(token)
  17. return if token.nil?
  18. JWT.decode(
  19. token,
  20. Rails.application.credentials.jwt_secret,
  21. true,
  22. algorithm: ALG,
  23. iss: ISS,
  24. verify_iss: true,
  25. aud: AUD,
  26. verify_aud: true,
  27. )
  28. rescue JWT::DecodeError => e
  29. Rails.logger.error("Failed to decode JWT: #{e.message}")
  30. raise Error, e.message
  31. end
  32. def self.meta
  33. {
  34. exp: 7.days.from_now.to_i,
  35. iss: ISS,
  36. aud: AUD,
  37. }
  38. end
  39. end