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
|