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
access_pass lib access_pass access_token_server.ex
Raw

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