Packages

Library used to get payload of a JWT

Current section

Files

Jump to
jwt_decoder lib jwt_decoder.ex
Raw

lib/jwt_decoder.ex

defmodule JwtDecoder do
@moduledoc """
Module that references jwt helper
"""
def get_data(jwt, padding \\ false) do
with {:ok, payload_base64} <- get_payload_encode(jwt),
{:ok, payload} <- decode_base64(payload_base64, padding),
{:ok, payload_map} <- decode_string_to_map(payload),
payload_struct <- map_to_atom(payload_map) do
{:ok, payload_struct}
else
:error_decode_base64 -> :error_decode_base64
:error_get_payload_encode -> :error_get_payload_encode
:error_decode_string_to_map -> :error_decode_string_to_map
end
end
defp get_payload_encode(jwt) do
with splitted_jwt <- String.split(jwt, "."),
3 <- Enum.count(splitted_jwt),
payload_base64 <- Enum.at(splitted_jwt, 1) do
{:ok, payload_base64}
else
_ -> :error_get_payload_encode
end
end
defp decode_string_to_map(value) do
case Poison.decode(value) do
{:ok, map} -> {:ok, map}
_ -> :error_decode_string_to_map
end
end
defp decode_base64(value, padding) do
case Base.decode64(value, padding: padding) do
{:ok, payload} -> {:ok, payload}
_ -> :error_decode_base64
end
end
defp map_to_atom(map), do: Map.to_list(map) |> Enum.map(fn {k, v} -> {String.to_atom(k), v} end) |> Map.new()
end