Current section
Files
Jump to
Current section
Files
lib/keen_auth.ex
defmodule KeenAuth do
@moduledoc """
## Configuration
```
config :keen_auth,
auth_controller: MyAppWeb.AuthenticationController,
strategies: [
azure_ad: [
token: MyAppWeb.AADToken,
strategy: Assent.Strategy.Azure,
config: [
client_id: "REPLACE_WITH_CLIENT_ID",
client_secret: "REPLACE_WITH_CLIENT_SECRET",
redirect_uri: "http://localhost:4000/azure_ad/callback"
]
],
github: [
token: MyAppWeb.GithubToken,
strategy: Assent.Strategy.Github,
config: [
client_id: "REPLACE_WITH_CLIENT_ID",
client_secret: "REPLACE_WITH_CLIENT_SECRET",
redirect_uri: "http://localhost:4000/github/callback"
]
]
]
```
"""
alias Plug.Conn
@type user() :: KeenAuth.User.t() | map() | term()
defmacro authentication_routes() do
# TODO since `auth_controller` cannot be retrieved based on OTP app configuration, route to concrete controller in `AuthenticationController` and move default implementation elsewhere
auth_controller = Application.get_env(:keen_auth, :auth_controller, KeenAuth.AuthenticationController)
email_enabled = Application.get_env(:keen_auth, :email_enabled, false)
email_block =
if email_enabled do
email_auth_controller = Application.get_env(:keen_auth, :email_auth_controller, KeenAuth.EmailAuthenticationController)
quote do
scope "/email" do
post("/new", unquote(email_auth_controller), :new)
end
end
else
nil
end
quote do
unquote(email_block)
scope "/:provider" do
get("/new", unquote(auth_controller), :new)
get("/callback", unquote(auth_controller), :callback)
post("/callback", unquote(auth_controller), :callback)
get("/delete", unquote(auth_controller), :delete)
end
get("/delete", unquote(auth_controller), :delete)
end
end
@spec current_user(Conn.t()) :: user()
def current_user(conn) do
conn.assigns[:current_user]
end
@spec authenticated?(Conn.t()) :: boolean()
def authenticated?(conn) do
current_user(conn) != nil
end
@spec assign_current_user(Conn.t(), user()) :: Plug.Conn.t()
def assign_current_user(conn, user) do
Conn.assign(conn, :current_user, user)
end
end