Packages
pow
0.1.0-alpha
1.0.39
1.0.38
1.0.37
1.0.36
1.0.35
1.0.34
1.0.33
1.0.32
1.0.31
1.0.30
1.0.29
1.0.28
1.0.27
1.0.26
1.0.25
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.1.0-rc.1
0.1.0-alpha.8
0.1.0-alpha.7
retired
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha
Robust user authentication solution
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/pow.ex
defmodule Pow do
@moduledoc """
A module that provides authentication system for your Phoenix app.
## Usage
Create `lib/my_project/pow.ex`:
defmodule MyApp.Pow do
use Pow,
user: MyApp.Users.User,
repo: MyApp.Repo
end
The following modules will be made available:
- `MyApp.Pow.Ecto.Schema`
- `MyApp.Pow.Phoenix.Router`
- `MyApp.Pow.Phoenix.Messages`
- `MyApp.Pow.Plug.Session`
For extensions integration, `Pow.Extension.Phoenix.ControllerCallbacks`
will also be automatically included in the configuration
unless `:controller_callbacks_backend` has already been set.
"""
alias Pow.Extension.Phoenix.ControllerCallbacks
defmacro __using__(config) do
quote do
config = unquote(__MODULE__).__parse_config__(unquote(config))
unquote(__MODULE__).__create_ecto_schema_mod__(__MODULE__, config)
unquote(__MODULE__).__create_phoenix_router_mod__(__MODULE__, config)
unquote(__MODULE__).__create_phoenix_messages_mod__(__MODULE__, config)
unquote(__MODULE__).__create_plug_session_mod__(__MODULE__, config)
end
end
def __parse_config__(config) do
Keyword.put_new(config, :controller_callbacks, ControllerCallbacks)
end
defmacro __create_ecto_schema_mod__(mod, config) do
quote do
config = unquote(config)
name = unquote(mod).Ecto.Schema
quoted = quote do
defmacro __using__(_opts) do
config = unquote(config)
quote do
use Pow.Ecto.Schema, unquote(config)
use Pow.Extension.Ecto.Schema, unquote(config)
@spec changeset(Ecto.Schema.t() | Ecto.Changeset.t(), map()) :: Ecto.Changeset.t()
def changeset(user_or_changeset, attrs) do
user_or_changeset
|> pow_changeset(attrs)
|> pow_extension_changeset(attrs)
end
end
end
end
Module.create(name, quoted, Macro.Env.location(__ENV__))
end
end
defmacro __create_phoenix_router_mod__(mod, config) do
quote do
config = unquote(config)
name = unquote(mod).Phoenix.Router
quoted = quote do
config = unquote(config)
defmacro __using__(_opts) do
name = unquote(name)
config = unquote(config)
quote do
require Pow.Phoenix.Router
use Pow.Extension.Phoenix.Router, unquote(config)
import unquote(name)
end
end
defmacro pow_routes do
quote do
Pow.Phoenix.Router.pow_routes()
pow_extension_routes()
end
end
end
Module.create(name, quoted, Macro.Env.location(__ENV__))
end
end
defmacro __create_phoenix_messages_mod__(mod, config) do
quote do
config = unquote(config)
name = unquote(mod).Phoenix.Messages
quoted = quote do
config = unquote(config)
defmacro __using__(_opts) do
config = unquote(config)
quote do
use Pow.Phoenix.Messages
use Pow.Extension.Phoenix.Messages,
unquote(config)
end
end
end
Module.create(name, quoted, Macro.Env.location(__ENV__))
end
end
defmacro __create_plug_session_mod__(mod, config) do
quote do
name = unquote(mod).Plug.Session
mod = Pow.Plug.Session
config = unquote(config)
quoted = quote do
def init(_opts), do: unquote(mod).init(unquote(config))
def call(conn, _opts), do: unquote(mod).call(conn, unquote(config))
def fetch(conn, _opts), do: unquote(mod).fetch(conn, unquote(config))
def create(conn, _opts), do: unquote(mod).create(conn, unquote(config))
def delete(conn, _opts), do: unquote(mod).delete(conn, unquote(config))
end
Module.create(name, quoted, Macro.Env.location(__ENV__))
end
end
@spec config :: Keyword.t()
def config, do: Application.get_env(:pow, Pow, [])
end