X402.Extension adapter advertising the auth-hints extension.
plug X402.Plug.PaymentGate,
routes: [...],
extensions: [
{X402.Extensions.AuthHints.Adapter,
auth_requirements: [
[accept_indexes: [1], methods: [X402.Extensions.AuthHints.oauth2(...)]]
]}
]Every 402 response advertises X402.Extensions.AuthHints.extension/1
for the configured requirements, minus any index that falls outside
the requirements actually offered to the request (a hook may have
replaced them); a requirement left without indexes is not advertised,
and neither is the extension when nothing remains. A context without
requirements advertises the configuration unchanged.
The hints only announce what the route expects. Checking the credentials a client then presents is the application's job, in the handler or in a plug ahead of the gate.
Summary
Functions
Advertises the configured requirements, dropping indexes outside the request's requirements.
Validates the adapter options.
Returns "auth-hints".
Functions
@spec advertise( keyword(), X402.Hooks.RequestContext.t() ) :: map() | nil
Advertises the configured requirements, dropping indexes outside the request's requirements.
Examples
iex> {:ok, opts} = X402.Extensions.AuthHints.Adapter.init(
...> auth_requirements: [[accept_indexes: [0, 1], methods: [X402.Extensions.AuthHints.sign_in_with_x()]]]
...> )
iex> context = X402.Hooks.RequestContext.new(requirements: [%{"scheme" => "exact"}])
iex> X402.Extensions.AuthHints.Adapter.advertise(opts, context)["info"]
%{"authRequirements" => [%{"acceptIndexes" => [0], "methods" => [%{"type" => "sign-in-with-x"}]}]}
iex> {:ok, opts} = X402.Extensions.AuthHints.Adapter.init(
...> auth_requirements: [[accept_indexes: [3], methods: [X402.Extensions.AuthHints.sign_in_with_x()]]]
...> )
iex> context = X402.Hooks.RequestContext.new(requirements: [%{"scheme" => "exact"}])
iex> X402.Extensions.AuthHints.Adapter.advertise(opts, context)
nil
Validates the adapter options.
Options
:auth_requirements- Required. The requirements, as accepted byX402.Extensions.AuthHints.extension/1.
Examples
iex> requirements = [[accept_indexes: [1], methods: [X402.Extensions.AuthHints.sign_in_with_x()]]]
iex> {:ok, opts} = X402.Extensions.AuthHints.Adapter.init(auth_requirements: requirements)
iex> opts[:auth_requirements]["info"]["authRequirements"]
[%{"acceptIndexes" => [1], "methods" => [%{"type" => "sign-in-with-x"}]}]
iex> {:error, message} = X402.Extensions.AuthHints.Adapter.init(auth_requirements: [[accept_indexes: [], methods: []]])
iex> message =~ "accept indexes"
true
iex> {:error, message} = X402.Extensions.AuthHints.Adapter.init([])
iex> message =~ ":auth_requirements"
true
@spec key() :: String.t()
Returns "auth-hints".
Examples
iex> X402.Extensions.AuthHints.Adapter.key()
"auth-hints"