NAME
Mojolicious::Plugin::DigestAuth - HTTP Digest Authentication for Mojolicious
SYNOPSIS
$self->plugin('digest_auth');
# In your action
return unless $self->digest_auth(allow => { sshaw => 'password' });
# Or, in startup()
my $r = $self->digest_auth('/admin', allow => { sshaw => 'password' });
$r->route('/new')->to('users#new');
CONFIGURATION
SETUP
Configuration can be done globally when loading the plugin
$self->plugin('digest_auth', %options)
or locally when calling digest_auth
$self->digest_auth(%options);
Local options override their global counterparts. For example, the following will apply to all authentication requests
# setup()
$self->plugin('digest_auth', realm => 'Thangz',
expires => 120,
allow => '/path/to/htdigest_file');
# controller
sub show
{
my $self = shift;
return unless $self->digest_auth;
# ...
}
But can be overridden within an action
sub edit
{
my $self = shift;
return unless $self->digest_auth(realm => 'RealmX',
expires => 24*3600,
allow => { sshaw => 'Ay3Br4h_!' });
# ...
}
For a full list of options see "digest_auth".
AUTHENTICATION
By default MD5/auth authentication is performed. This is configurable, see "digest_auth".
DB
Authentication information is given via the allow
option and can be retrieved from a variety of sources:
A hash reference without a realm
$self->plugin('digest_auth', allow => { sshaw => 'my_pAzw3rD', admin => '->fofinha!' });
In this case users will either be placed into the realm given by the
realm
option or the default realm,WWW
.Passwords must be given in plain text.
A hash reference with realm(s)
$self->plugin('digest_auth', allow => { 'Admin Realm' => { sshaw => 'my_pAzw3rD' }, 'WWW Users' => { tony => 'vrooooooom' });
Passwords must be given in plain text.
An htdigest style file
$self->plugin('digest_auth', allow => '/home/sshaw/www_users');
An object with a
get()
method that returns hashed passwords$self->plugin('digest_auth', allow => $db);
Arguments are passed to
get()
in the following order:realm, username
.
PERFORMING AUTHENTICATION
Authentication can be performed by calling the digest_auth
method from within the action you'd like to protect:
sub some_action
{
my $self = shift;
return unless $self->digest_auth;
# Authenticated users get here
}
If authentication is successful digest_auth
returns true, otherwise undef
is returned and a HTTP 401 status code and the message: HTTP 401: Unauthorized
are sent to the client. Currently this message cannot be changed.
Authentication can also be performed for a set of routes by calling digest_auth
from within your application's startup function. This form performs authentication automatically for all of the routes defined under the given URL:
package YourWebApp;
use Mojo::Base 'Mojolicious';
sub startup
{
my $self = shift;
$self->plugin('digest_auth', %options);
# ...
my $admin = $self->digest_auth('/admin');
$admin->route('/new')->to('users#new');
$admin->route('/edit/:id')->to('users#edit');
}
In this case authentication is performed via a bridge with a callback.
WEB SERVERS
Authentication will fail if your application is sitting behind a web server does not pass the Authorization header to your application. In Apache this can be achieved with mod_rewrite
:
RewriteEngine On
RewriteRule ^ - [E=X-HTTP_AUTHORIZATION:%{HTTP:Authorization}]
METHODS
plugin
$self->plugin('digest_auth', %options)
Loads the plugin and sets up the defaults given by %options
.
Arguments
%options
See "digest_auth".
Errors
This method will croak
if if any of the options are invalid or if there is an error loading the password database.
digest_auth
$self->digest_auth(%options)
$routes = $self->digest_auth($url, %options)
Arguments
$url
Optional. If provided authentication will be performed for all routes defined under $url
. See "PERFORMING AUTHENTICATION".
%options
allow => { user => password }
allow => { realm => { user => password }}
allow => 'htdigest_file'
allow => $obj
See "DB".
algorithm => 'MD5' | 'MD5-sess'
Digest algorithm, either
'MD5'
or'MD5-sess'
. Defaults to'MD5'
,'MD5-sess'
requires aqop
.domain => '/path' | 'your.domain.com'
Authentication domain. Defaults to
'/'
.expires => seconds
Nonce lifetime. Defaults to
300
seconds (5 minutes).qop => 'auth' | ''
Quality of protection. Defaults to
'auth'
.auth-int
is not supported.realm => 'Your Realm'
Authentication realm. Defaults to
'WWW'
.secret => 'a salt value'
Used to create the nonce. Defaults to your application's secret, which means you must set your application's secret before loading this plugin. If you're using an array the first value in the array will be used.
IMPORTANT: Changing this value will cause an HTTP 400 response to be returned to any clients with cached authentication credentials.
support_broken_browsers => 1 | 0
When processing requests from certain browsers skip steps that would otherwise result in a HTTP 400 response. Defaults to
1
.Currently only applies to IE 5 and 6. These two browsers fail to append the query string to the URI included in the Authorization header and, after authenticating, fail to include the opaque value.
Returns
Without a URL prefix:
True if authentication was successful, undef
otherwise. If unsuccessful a HTTP 401 status code and message are sent to the client.
With a URL prefix:
An instance of Mojolicious::Routes. See "PERFORMING AUTHENTICATION".
Errors
Will croak
if any of the options are invalid.
SEE ALSO
Mojolicious, Mojolicious::Plugin::BasicAuth, http://en.wikipedia.org/wiki/Digest_access_authentication
AUTHOR
Skye Shaw (skye.shaw AT gmail.com)
LICENSE
Copyright (c) 2011 Skye Shaw. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.