Packages
indieweb
0.0.58
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.56
0.0.55
0.0.54
0.0.53
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.3
0.0.2
0.0.1
Collection of common IndieWeb utilites like authorship resolution, Webmention, post type discovery and IndieAuth.
Current section
Files
Jump to
Current section
Files
lib/indieweb/auth/default/token.ex
defmodule IndieWeb.Auth.DefaultTokenAdapter do
@moduledoc """
Provides a implementation of the token-centric parts of IndieAuth.
"""
@behaviour IndieWeb.Auth.Token.Adapter
alias IndieWeb.Cache
@impl true
def info(token, options \\ []) do
case Cache.get(do_make_token_key(token), options) do
data when is_binary(data) -> URI.decode_query(data)
_ -> {:error, :token_not_found}
end
end
@impl true
def delete(token, options \\ []) do
Cache.delete(do_make_token_key(token), options)
end
@impl true
def generate(client_id, scope, options \\ []) do
token = do_make_token(client_id, scope)
case Cache.set(
do_make_token_key(token),
URI.encode_query(%{"scope" => scope, "client_id" => client_id}),
[],
options
) do
:ok -> {:ok, token}
error -> {:error, :failed_to_save_token, reason: error}
end
end
defp do_make_token(client_id, scope) do
token_data =
[
:crypto.strong_rand_bytes(32),
client_id,
scope
]
|> Enum.map(&Base.encode16(&1, padding: false, case: :lower))
|> Enum.join()
:crypto.hash(:sha256, token_data) |> Base.encode64(padding: false)
end
defp do_make_token_key(token) do
:crypto.hash(:sha256, "token:#{token}")
|> Base.encode16(padding: false, case: :lower)
end
end