Current section

Files

Jump to
joken lib joken.ex
Raw

lib/joken.ex

defmodule Joken do
alias Joken.Token
@type algorithm :: :HS256 | :HS384 | :HS512
@type claim :: :exp | :nbf | :iat | :aud | :iss | :sub | :jti
@type status :: :ok | :error
@type payload :: map | Keyword.t
@moduledoc """
Encodes and decodes JSON Web Tokens.
Supports the following algorithms:
* HS256
* HS384
* HS512
Supports the following claims:
* Expiration (exp)
* Not Before (nbf)
* Audience (aud)
* Issuer (iss)
* Subject (sub)
* Issued At (iat)
* JSON Token ID (jti)
Usage:
First, create a module that implements the `Joken.Config` Behaviour.
This Behaviour is responsible for the following:
* encoding and decoding tokens
* adding and validating claims
* secret key used for encoding and decoding
* the algorithm used
If a claim function returns `nil` then that claim will not be added to the token.
Here is a full example of a module that would add and validate the `exp` claim
and not add or validate the others:
defmodule My.Config.Module do
@behaviour Joken.Config
def secret_key() do
Application.get_env(:app, :secret_key)
end
def algorithm() do
:H256
end
def encode(map) do
Poison.encode!(map)
end
def decode(binary) do
Poison.decode!(binary, keys: :atoms!)
end
def claim(:exp, payload) do
Joken.Config.get_current_time() + 300
end
def claim(_, _) do
nil
end
def validate_claim(:exp, payload, options) do
Joken.Config.validate_time_claim(payload, :exp, "Token expired", fn(expires_at, now) -> expires_at > now end)
end
def validate_claim(_, _, _) do
:ok
end
end
Joken looks for a `joken` config with `config_module`. `config_module` module being a module that implements the `Joken.Config` Behaviour.
config :joken,
config_module: My.Config.Module
then to encode and decode
{:ok, token} = Joken.encode(%{username: "johndoe"})
{:ok, decoded_payload} = Joken.decode(jwt)
"""
@doc """
Encodes the given payload and optional claims into a JSON Web Token
Joken.encode(%{ name: "John Doe" })
"""
@spec encode(payload) :: { status, String.t }
def encode(payload) do
Token.encode(config_module, payload)
end
@doc """
Decodes the given JSON Web Token and gets the payload
token: The jwt token string to decode
options (optional): a keyword list of decoding options. Most are passed to
the validate_claim function when validating the claim. The `skip` option is
not and is used to tell the decoder to skip the given claims when validating
ex.
#decode the given string with no options given
Joken.decode(token)
#decode the given string while skipping the exp claim
Joken.decode(token, [ skip: [:exp] ])
#decode the given string and pass the following the validate_claim function
Joken.decode(token, [ user_id: 1, roles: [:admin] ])
"""
@spec decode(String.t, Keyword.t) :: { status, map | String.t }
def decode(jwt, options \\ []) do
Token.decode(config_module, jwt, options)
end
defp config_module() do
Application.get_env(:joken, :config_module)
end
end