farmbot_os/lib/farmbot/jwt.ex

42 lines
1008 B
Elixir
Raw Normal View History

2017-08-16 10:31:29 -06:00
defmodule Farmbot.Jwt do
@moduledoc "Functions for dealing with the Farmbot JSON Web Token"
defstruct [
:bot,
:exp,
:iss,
:mqtt,
2017-11-13 12:55:37 -07:00
:virtual_host,
2017-10-11 16:53:00 -06:00
:os_update_server
2017-08-16 10:31:29 -06:00
]
@typedoc "Type def for Farmbot Web Token."
@type t :: %__MODULE__{
2017-10-11 16:53:00 -06:00
bot: binary,
exp: number,
iss: binary,
mqtt: binary,
os_update_server: binary
}
2017-08-16 10:31:29 -06:00
@doc "Decode a token."
@spec decode(binary) :: {:ok, t} | {:error, term}
def decode(tkn) do
body = tkn |> String.split(".") |> Enum.at(1)
2017-10-11 16:53:00 -06:00
2017-08-16 10:31:29 -06:00
with {:ok, json} <- Base.decode64(body, padding: false),
2017-10-11 16:53:00 -06:00
{:ok, jwt} <- Poison.decode(json, as: %__MODULE__{}),
2017-08-16 10:31:29 -06:00
do: {:ok, jwt}
end
@doc "Decodes a token, raises if it fails."
@spec decode!(binary) :: t | no_return
def decode!(tkn) do
case decode(tkn) do
{:ok, tkn} -> tkn
:error -> raise "Failed to base64 decode."
{:error, {:invalid, _char, _pos}} -> raise "Failed to json decode."
end
end
end