farmbot_os/lib/farmbot/jwt.ex

64 lines
1.4 KiB
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-27 14:48:07 -07:00
:vhost,
2017-11-28 14:59:04 -07:00
:os_update_server,
2018-01-21 15:10:45 -07:00
:beta_os_update_server,
2018-06-11 16:15:47 -06:00
:interim_email
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,
2017-11-27 14:48:07 -07:00
os_update_server: binary,
vhost: binary,
2017-11-28 14:59:04 -07:00
interim_email: binary
2017-10-11 16:53:00 -06:00
}
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),
2018-06-11 16:57:34 -06:00
{:ok, data} <- Farmbot.JSON.decode(json),
{:ok, jwt} <- decode_map(data) do
2018-06-11 16:15:47 -06:00
{:ok, jwt}
else
2018-06-11 16:57:34 -06:00
:error -> {:error, "base64_decode_fail"}
{:error, _resson} -> {:error, "json_decode_error"}
2018-06-11 16:15:47 -06:00
end
2017-08-16 10:31:29 -06:00
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
2018-06-11 16:15:47 -06:00
{:error, reason} -> raise(reason)
2017-08-16 10:31:29 -06:00
end
end
2018-06-11 16:57:34 -06:00
defp decode_map(%{} = map) do
{:ok,
struct(
Farmbot.Jwt,
bot: map["bot"],
exp: map["exp"],
iss: map["iss"],
mqtt: map["mqtt"],
os_update_server: map["os_update_server"],
vhost: map["vhost"],
interim_email: map["interim_email"]
)}
end
2017-08-16 10:31:29 -06:00
end