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