NAME
Plack::Middleware::Auth::Complex - Feature-rich authentication system
SYNOPSIS
use Plack::Builder;
builder {
  enable 'Auth::Complex', dbi_connect => ['dbi:Pg:dbname=mydb', '', ''], mail_from => 'nobody@example.org';
  sub {
    my ($env) = @_;
    [200, [], ['Hello ' . ($env->{REMOTE_USER} // 'unregistered user')]]
  }
}
DESCRIPTION
AuthComplex is an authentication system for Plack applications that allows user registration, password changing and password reset.
AuthComplex sets REMOTE_USER if the request includes correct basic authentication and intercepts POST requests to some configurable URLs. It also sets $env->{authcomplex} to itself before passing the request.
Some options can be controlled by passing a hashref to the constructor. More customization can be achieved by subclassing this module.
Intercepted URLs
Only POST requests are intercepted. Parameters can be either query parameters or body parameters. Using query parameters is not recommended. These endpoints return 200 for success, 400 for client error and 500 for server errors. All parameters are mandatory.
- POST /action/register?username=user&password=pw&confirm_password=pw&email=user@example.org
 - 
This URL creates a new user with the given username, password and email. The two passwords must match, the user must match
username_regexand the user must not already exist. - POST /action/passwd?password=oldpw&new_password=newpw&confirm_new_password=newpw
 - 
This URL changes the password of a user. The user must be authenticated (otherwise the endpoint will return 401).
 - POST /action/request-reset?username=user
 - 
This URL requests a password reset token for the given user. The token will be sent to the user's email address.
A reset token in the default implementation is
base64(HMAC-SHA1("$username $passphrase $expiration_unix_time")) . ":$expiration_user_time". - POST /action/reset?username=user&new_password=pw&confirm_new_password=pw&token=token
 - 
This URL performs a password reset.
 
Constructor arguments
- dbi_connect
 - 
Arrayref of arguments to pass to DBI->connect. Defaults to
['dbi:Pg', '', '']. - entropy_source
 - 
Data::Entropy::Sourceobject to get random numbers from. By default uses /dev/urandom viaData::Entropy::RawSource::Localif possible, or the default entropy source otherwise. A warning is printed if the default entropy source is used, to supress it set this argument to the default entropy source. - use_scrypt
 - 
Boolean determining whether to use the scrypt algorithm via the
Authen::Passphrase::Scryptmodule.If true, the default implementation of
hash_passphraseuses scrypt andcheck_passphraseaccepts scrypt passphrases (in addition to passphrases supported byAuthen::Passphrase).If false, the default implementation of
hash_passphraseuses bcrypt andcheck_passphraseonly accepts passphrases supported byAuthen::Passphrase.The default value is true if
Authen::Passphrase::Scryptis installed, false otherwise. - post_connect_cb
 - 
Callback (coderef) that is called just after connecting to the database. Used by the testsuite to create the users table.
 - select_user
 - 
SQL statement that selects a user by username. Defaults to
'SELECT id, passphrase, email FROM users WHERE id = ?'. - update_pass
 - 
SQL statement that updates a user's password. Defaults to
'UPDATE users SET passphrase = ? WHERE id = ?'. - insert_user
 - 
SQL statement that inserts a user. Defaults to
'INSERT INTO users (id, passphrase, email) VALUES (?,?,?)'. - hmackey
 - 
HMAC key used for password reset tokens. If not provided it is generated randomly, in which case reset tokens do not persist across application restarts.
 - mail_from
 - 
From: header of password reset emails. If not provided, password reset is disabled.
 - mail_subject
 - 
The subject of password reset emails. Defaults to
'Password reset token'. - realm
 - 
Authentication realm. Defaults to
'restricted area'. - cache_fail
 - 
If true, all authentication results are cached. If false, only successful logins are cached. Defaults to false.
 - cache_max_age
 - 
Authentication cache timeout, in seconds. Authentication results are cached for this number of seconds to avoid expensive hashing. Defaults to 5 minutes.
 - token_max_age
 - 
Password reset token validity, in seconds. Defaults to 1 hour.
 - username_regex
 - 
Regular expression that matches valid usernames. Defaults to
qr/^\w{2,20}$/as. - invalid_username
 - 
Error message returned when the username does not match username_regex. Defaults to
'Invalid username' - register_url
 - 
URL for registering. Defaults to
'/action/register'. - passwd_url
 - 
URL for changing your password. Defaults to
'/action/passwd'. - request_reset_url
 - 
URL for requesting a password reset token by email. Defaults to
'/action/request-reset'. - reset_url
 - 
URL for resetting your password with a reset token. Defaults to
'/action/reset'. 
Methods
- default_opts
 - 
Returns a list of default options for the constructor.
 - new(\%opts)
 - 
Creates a new AuthComplex object.
 - init
 - 
Called when the first request is received. The default implementation connects to the database, calls
post_connect_cband prepares the SQL statements. - create_user($parms)
 - 
Inserts a new user into the database. $parms is a Hash::MultiValue object containing the request parameters.
 - get_user($username)
 - 
Returns a hashref with (at least) the following keys: passphrase (the RFC2307-formatted passphrase of the user), email (the user's email address).
 - check_passphrase($username, $passphrase)
 - 
Returns true if the given plaintext passphrase matches the one obtained from database. Default implementation uses Authen::Passphrase (and Authen::Passphrase::Scrypt if
use_scryptis true). - hash_passphrase($passphrase)
 - 
Returns a RFC2307-formatted hash of the passphrase.
If
use_scryptis true, default implementation uses Authen::Passphrase::Scrypt with default parameters.If
use_scryptis false, default implementation uses Authen::Passphrase::BlowfishCrypt with a cost of 10 and a random salt. - set_passphrase($username, $passphrase)
 - 
Changes a user's passphrase to the given value.
 - make_reset_hmac($username, [@data])
 - 
Returns the HMAC part of the reset token.
 - mail_body($username, $token)
 - 
Returns the body of the password reset email for the given username and password reset token.
 - send_reset_email($username)
 - 
Generates a new reset token and sends it to the user via email.
 - response($code, $body)
 - 
Helper method. Returns a PSGI response with the given response code and string body.
 - reply($message)
 - 
Shorthand for
response(200, $message). - bad_request($message)
 - 
Shorthand for
response(400, $message). - internal_server_error($message)
 - 
Shorthand for
response(500, $message). - 
Returns a 401 Authorization required response.
 - call_register($req)
 - 
Handles the
/action/registerendpoint. $req is a Plack::Request object. - call_passwd($req)
 - 
Handles the
/action/passwdendpoint. $req is a Plack::Request object. - call_request_reset($req)
 - 
Handles the
/action/request-resetendpoint. $req is a Plack::Request object. - call_reset($req)
 - 
Handles the
/action/resetendpoint. $req is a Plack::Request object. 
AUTHOR
Marius Gavrilescu, <marius@ieval.ro>
COPYRIGHT AND LICENSE
Copyright (C) 2015-2017 by Marius Gavrilescu
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.20.1 or, at your option, any later version of Perl 5 you may have available.