Current section
Files
Jump to
Current section
Files
lib/jwt_mocker.ex
defmodule JwtTestUtils.JwtMocker do
@moduledoc """
Module to generate and validate a JWT token
"""
import Joken
@secret_key "secret_key"
@doc """
Returns the secret key used to sign the mock JWT tokens
"""
@spec secret_key() :: String.t()
def secret_key, do: @secret_key
@doc """
Generate a JWT token given a username.
## Examples
iex> JwtTestUtils.JwtMocker.generate_json_token("a_username")
"ees45nj3453jkbgbrk3jtvnvjkwn254ioj5iogf4nnj42gn24jkgnt35353ella2375zp1m4me"
"""
@spec generate_json_token(String.t(), Integer.t()) :: String.t()
def generate_json_token(username, exp \\ 0) do
%{username: username, exp: exp}
|> token()
|> with_signer(hs256(@secret_key))
|> sign()
|> get_compact()
end
@doc """
Validates a JWT token for the given username.
## Examples
iex> JwtTestUtils.JwtMocker.validate_token("ees45nj3453jkbgbrk3jtvnvjkwn254ioj5iogf4nnj42gn24jkgnt35353ella2375zp1m4me", "a_username")
:ok
iex> JwtTestUtils.JwtMocker.validate_token("", "a_username")
:error
"""
@spec validate_token(String.t(), String.t(), Integer.t()) :: :ok | :error
def validate_token(jwt, username, exp \\ 0) do
jwt
|> token()
|> with_validation("username", &(&1 == username))
|> with_validation("exp", &(&1 == exp))
|> verify!(hs256(@secret_key))
|> elem(0)
end
end