Packages
pow
1.0.24
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/plug/message_verifier.ex
defmodule Pow.Plug.MessageVerifier do
@moduledoc """
This module can sign and verify messages.
Based on `Phoenix.Token`.
"""
alias Plug.{Conn, Crypto.KeyGenerator, Crypto.MessageVerifier}
@callback sign(Conn.t(), binary(), binary(), keyword()) :: binary()
@callback verify(Conn.t(), binary(), binary(), keyword()) :: {:ok, binary()} | :error
@doc """
Signs a message.
`Plug.Crypto.MessageVerifier.sign/2` is used. The secret is derived from the
`salt` and `conn.secret_key_base` using
`Plug.Crypto.KeyGenerator.generate/3`. If `:key_generator_opts` is set in the
config, this will be passed on to `Plug.Crypto.KeyGenerator`.
"""
@spec sign(Conn.t(), binary(), binary(), keyword()) :: binary()
def sign(conn, salt, message, config) do
secret = derive(conn, salt, key_opts(config))
MessageVerifier.sign(message, secret)
end
@doc """
Verifies a message.
`Plug.Crypto.MessageVerifier.sign/2` is used. The secret is derived from the
`salt` and `conn.secret_key_base` using
`Plug.Crypto.KeyGenerator.generate/3`. If `:key_generator_opts` is set in the
config, this will be passed on to `Plug.Crypto.KeyGenerator`.
"""
@spec verify(Conn.t(), binary(), binary(), keyword()) :: {:ok, binary()} | :error
def verify(conn, salt, message, config) do
secret = derive(conn, salt, key_opts(config))
MessageVerifier.verify(message, secret)
end
defp derive(conn, key, key_opts) do
conn.secret_key_base
|> validate_secret_key_base()
|> KeyGenerator.generate(key, key_opts)
end
defp validate_secret_key_base(nil),
do: raise ArgumentError, "No conn.secret_key_base set"
defp validate_secret_key_base(secret_key_base) when byte_size(secret_key_base) < 64,
do: raise ArgumentError, "conn.secret_key_base has to be at least 64 bytes"
defp validate_secret_key_base(secret_key_base), do: secret_key_base
defp key_opts(config), do: Keyword.get(config, :key_generator_opts, [])
end