Current section

Files

Jump to
joken lib joken.ex
Raw

lib/joken.ex

defmodule Joken do
alias Joken.Token
alias Joken.Utils
@type algorithm :: :HS256 | :HS384 | :HS512
@type status :: :ok | :error
@type payload :: map | Keyword.t
@moduledoc """
Encodes and decodes JSON Web Tokens.
Usage:
Looks for a joken config block with `secret_key`, `algorithm`, and `json_module`. Json module being a module that implements the `Joken.Codec` Behaviour
defmodule My.Json.Module do
alias Poison, as: JSON
@behaviour Joken.Json
def encode(map) do
JSON.encode!(map)
end
def decode(binary) do
JSON.decode!(binary, keys: :atoms!)
end
end
config :joken
secret_key: "test",
json_module: My.Json.Module,
algorithm: :HS256, #Optional. defaults to :HS256
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" }, %{ iss: "self"})
"""
@spec encode(payload, payload) :: { status, String.t }
def encode(payload, claims \\ %{}) do
json_module = Application.get_env(:joken, :json_module)
algorithm = Application.get_env(:joken, :algorithm, :HS256)
Token.encode(secret_key, json_module, payload, algorithm, claims)
end
@doc """
Decodes the given JSON Web Token and gets the payload. Optionally checks against
the given claims for validity
Joken.decode(token, %{ aud: "self" })
"""
@spec decode(String.t, payload) :: { status, map | String.t }
def decode(jwt, claims \\ %{}) do
json_module = Application.get_env(:joken, :json_module)
algorithm = Application.get_env(:joken, :algorithm, :HS256)
Token.decode(secret_key, json_module, jwt, algorithm, claims)
end
defp secret_key do
secret_key = Application.get_env(:joken, :secret_key)
if Application.get_env(:joken, :decode_secret_key?, false) do
Utils.base64url_decode(secret_key)
else
secret_key
end
end
end