Packages
Provides a full user authentication experience for an API. Includes login,logout,register,forgot password, forgot username, confirmation email and all that other good stuff. Includes plug for checking for authenticated users and macro for generating the required routes.
Current section
Files
Jump to
Current section
Files
lib/access_pass/access_token_server.ex
defmodule AccessPass.AccessTokenServer do
@moduledoc false
import AccessPass.Importer
use GenServer
@name :access_token
@ets :access_token_ets
alias AccessPass.{GateKeeper, RefreshToken}
import AccessPass.Config
def start_link() do
GenServer.start_link(__MODULE__, {%{}, %{}}, name: @name)
end
def init(state) do
new(@ets, [:set, :public, :named_table])
{:ok, state}
end
def handle_call({:add, refresh_token, meta}, _, _) do
access_token = GateKeeper.genToken()
insert_with_revoke(
@ets,
{access_token, refresh_token, meta},
{@name, {:revoke, access_token}, access_expire_in() * 1000}
)
{:reply, access_token, %{}}
end
def handle_call({:revoke, access_token}, _, _) do
case match(@ets, {access_token, :"$1", :_}) do
[[val]] -> RefreshToken.revoke_self_only(val)
_ -> :ok
end
delete(@ets, access_token)
{:reply, {:ok}, %{}}
end
def handle_info({:revoke, access_token}, _) do
delete(@ets, access_token)
{:noreply, %{}}
end
def handle_cast({:revoke, refresh_token}, %{}) do
match_delete(@ets, {:_, refresh_token, :_})
{:noreply, %{}}
end
def check(access_token) do
case match(@ets, {access_token, :_, :"$1"}) do
[[val]] -> {:ok, val}
_ -> return_expire_error()
end
end
defp return_expire_error() do
{:error, "access token expired"}
end
end