31 lines
862 B
Crystal
31 lines
862 B
Crystal
# Generates and decodes JSON Web Tokens for Authenticating users.
|
|
class UserToken
|
|
Habitat.create { setting stubbed_token : String? }
|
|
ALGORITHM = JWT::Algorithm::HS256
|
|
|
|
def self.generate(user : User) : String
|
|
payload = {"user_id" => user.id}
|
|
|
|
settings.stubbed_token || create_token(payload)
|
|
end
|
|
|
|
def self.create_token(payload)
|
|
JWT.encode(payload, Lucky::Server.settings.secret_key_base, ALGORITHM)
|
|
end
|
|
|
|
def self.decode_user_id(token : String) : Int64?
|
|
payload, _header = JWT.decode(token, Lucky::Server.settings.secret_key_base, ALGORITHM)
|
|
payload["user_id"].to_s.to_i64
|
|
rescue e : JWT::Error
|
|
Lucky.logger.error(jwt_decode_error: e.message)
|
|
nil
|
|
end
|
|
|
|
# Used in tests to return a fake token to test against.
|
|
def self.stub_token(token : String)
|
|
temp_config(stubbed_token: token) do
|
|
yield
|
|
end
|
|
end
|
|
end
|