APIacBasicAuth
An APIac.Authenticator plug for API authentication using the HTTP Basic scheme
The HTTP Basic scheme simply consists in transmitting a client and its password
in the Authorization HTTP header. It is base64-encoded:
GET /api/accounts HTTP/1.1
Host: example.com
Authorization: Basic Y2xpZW50X2lkOmNsaWVudF9wYXNzd29yZA==
Accept: */*
The decoded value of Y2xpZW50X2lkOmNsaWVudF9wYXNzd29yZA== is client_id:client_password
This scheme is also sometimes called APIKey by some API managers.
Installation
def deps do
[
{:apiac_auth_basic, "~> 1.0"},
]
endExample with callback function
The callback function will be called with the realm and client and return string password or an %Expwd.Hashed{} struct:
plug APIacAuthBasic, realm: "my realm",
callback: &Module.get_client_password/2Example with configuration file
{client_id, client_secret} pairs can be configured in you application configuration files.
There will be compiled at compile time. If you need runtime configurability,
use the callback option instead.
Storing cleartext password requires special care, for instance: using *.secret.exs files,
encrypted storage of these config files, etc. Consider using hashed password instead, such
as Expwd.Hashed.Portable.t
Pairs a to be set separately for each realm in the clients key, as following:
config :apiac_auth_basic,
clients: %{
# using Expwd Hashed portable password
"realm_a" => [
{"client_1", {:expwd, :sha256, "lYOmCIZUR603rPiIN0agzBHFyZDw9xEtETfbe6Q1ubU"}},
{"client_2", {:expwd, :sha256, "mnAWHn1tSHEOCj6sMDIrB9BTRuD4yZkiLbjx9x2i3ug"}},
{"client_3", {:expwd, :sha256, "9RYrMJSmXJSN4CSJZtOX0Xs+vP94meTaSzGc+oFcwqM"}},
{"client_4", {:expwd, :sha256, "aCL154jd8bNw868cbsCUw3skHun1n6fGYhBiITSmREw"}},
{"client_5", {:expwd, :sha256, "xSE6MkeC+gW7R/lEZKxsWGDs1MlqEV4u693fCBNlV4g"}}
],
"realm_b" => [
{"client_1", {:expwd, :sha256, "lYOmCIZUR603rPiIN0agzBHFyZDw9xEtETfbe6Q1ubU"}}
],
# UNSAFE: cleartext passwords set directly in the config file
"realm_c" => [
{"client_6", "cleartext password"},
{"client_7", "cleartext password again"}
]
}the in your Plug pipeline:
Plug APIacAuthBasic, realm: "realm_a"