The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

WWW::Suffit::Plugin::BasicAuth - The Mojolicious Plugin for HTTP basic authentication and authorization

SYNOPSIS

    # in your startup
    $self->plugin('WWW::Suffit::Plugin::BasicAuth', {
            realm => "Strict Zone",
            authn_fail_render => {
                status => 401,
                json => {
                    status => 0,
                    message => "Basic authentication required!",
                },
            },
            authz_fail_render => {
                status => 403,
                json => {
                    status => 0,
                    message => "Forbidden!",
                },
            },
        });

    # in your routes
    sub index {
        my $self = shift;

        # Basic authentication
        return unless $self->is_basic_authenticated({ render_by_fail => 1 });

        # Basic Authorization
        return unless $self->is_basic_authorized({ render_by_fail => 1 });

        $self->render(...);
    }

    # or as condition in your startup
    $self->routes->get('/info')->requires(basic_authenticated => 1, basic_authorized => 1)
        ->to('alpha#info');

    # or bridged in your startup
    my $auth = $self->routes->under(sub {
        my $self = shift;

        # Basic authentication
        return unless $self->is_basic_authenticated({ render_by_fail => 1 });

        # Basic Authorization
        return unless $self->is_basic_authorized({ render_by_fail => 1 });

        return 1;
    });
    $auth->get('/info')->to('alpha#info');

DESCRIPTION

The Mojolicious Plugin for HTTP basic authentication and authorization

This plugin based on NoRFC::Server::Auth

OPTIONS

This plugin supports the following options

authn

Authentication checker callback

    $self->plugin('WWW::Suffit::Plugin::BasicAuth', {authn => sub {
        my ($controller, $realm, $username, $password, $params) = @_;

        # ...

        return 1; # or 0 on fail
    }});

The $params holds options from "is_basic_authenticated" call directly

authz

Authorization checker callback

    $self->plugin('WWW::Suffit::Plugin::BasicAuth', {authz => sub {
        my ($controller, $params) = @_;

        # ...

        return 1; # or 0 on fail
    }});

The $params holds options from "is_basic_authorized" call directly

authn_fail_render

Defines what is to be rendered when the authenticated condition is not met

Set to a coderef which will be called with the following signature:

    sub {
        my $controller = shift;
        my $realm = shift;
        my $resp = shift; # See authn_fail_render
        ...
        return $hashref;
    }

The return value of the subroutine will be ignored if it evaluates to false. If it returns a hash reference, it will be dereferenced and passed as-is to the controller's render function

If set directly to a hash reference, that will be passed to render instead

authz_fail_render

Defines what is to be rendered when the authorized condition is not met

Set to a coderef which will be called with the following signature:

    sub {
        my $controller = shift;
        my $resp = shift; # See authz_fail_render
        ...
        return $hashref;
    }

See also "authn_fail_render"

realm

    $self->plugin('WWW::Suffit::Plugin::BasicAuth', {realm => 'My Castle!'});

HTTP Realm, defaults to 'Strict Zone'

HELPERS

is_basic_authenticated

This helper performs credential validation and checks the authentication status

    my $authenticated = $self->is_basic_authenticated;
    my $authenticated = $self->is_basic_authenticated({
            render_by_fail => 1,
            authn => sub {
                my ($c, $in_realm, $in_user, $in_pass, $params) = @_;
                return 0 unless $in_user;
                return secure_compare($in_pass, "mypass") ? 1 : 0;
            },
            fail_render => {
                json => {
                    message => "Basic authentication required!",
                },
                status => 401,
            },
        });
render_by_fail

It enables rendering the fail response. See "authn_fail_render"

authn

It defines code of authentication

fail_render

It is render parameters as "authn_fail_render"

is_basic_authorized

This helper checks the authorization status

    my $authorized = $self->is_basic_authorized;
    my $authorized = $self->is_basic_authorized({
            render_by_fail => 1,
            authz => sub {
                my ($c, $params) = @_;
                return 1; # Basic authorization tsatus
            },
            fail_render => {
                json => {
                    message => "Forbidden!",
                },
                status => 403,
            },

        });
render_by_fail

It enables rendering the fail response. See "authz_fail_render"

authz

It defines code of authorization

fail_render

It is render parameters as "authz_fail_render"

METHODS

Internal methods

register

This method register the plugin and helpers in Mojolicious application.

EXAMPLES

Examples of using

ROUTING VIA CONDITION

This plugin exports a routing condition you can use in order to limit access to certain documents to only authenticated users.

    $self->routes->get('/info')->requires(basic_authenticated => 1, basic_authorized => 1)
        ->to('alpha#info');

Prior to Mojolicious 9, use "over" instead of "requires."

ROUTING VIA CALLBACK

If you want to be able to send people to a login page, you will have to use the following:

    sub index {
        my $self = shift;

        $self->redirect_to('/login') and return 0
            unless($self->is_basic_authenticated && $self->is_basic_authorized);

        $self->render(...);
    }

ROUTING VIA BRIDGE

    my $auth = $self->routes->under(sub {
        my $self = shift;

        # Authentication
        return unless $self->is_basic_authenticated({
            render_by_fail => 1
        });

        # Authorization
        return unless $self->is_basic_authorized({
            render_by_fail => 1
        });

        return 1;
    });
    $auth->get('/info')->to('alpha#info');

SEE ALSO

Mojolicious, NoRFC::Server::Auth, Mojolicious::Plugin::Authentication, Mojolicious::Plugin::Authorization, Mojolicious::Plugin::BasicAuth, Mojolicious::Plugin::HttpBasicAuth

AUTHOR

Serż Minus (Sergey Lepenkov) https://www.serzik.com <abalama@cpan.org>

COPYRIGHT

Copyright (C) 1998-2023 D&D Corporation. All Rights Reserved

LICENSE

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

See LICENSE file and https://dev.perl.org/licenses/