NAME

Catalyst::Controller::RequestToken - Handling transaction tokens across forms

SYNOPSIS

requires Catalyst::Plugin::Session module, in your application class:

use Catalyst qw/
    Session
    Session::State::Cookie
    Session::Store::FastMmap
    FillInForm
 /;

in your controller class:

use base qw(Catalyst::Controller::RequestToken);

sub form :Local {
    my ($self, $c) = @_;
    $c->stash( template => 'form.tt' );
}

sub confirm :Local :CreateToken {
    my ($self, $c) = @_;
    $c->stash( template => 'confirm.tt' );
}

sub complete :Local :ValidateToken {
    my ($self, $c) = @_;

    if ($self->valid_token($c)) {
        $c->response->body('complete.');
    }
    eles {
        $c->response->body('invalid operation.');
    }
}

form.tt

<html>
<body>
<form action="confirm" method="post">
<input type="submit" name="submit" value="confirm"/>
</form>
</body>
</html>

confirm.tt

<html>
<body>
<form action="complete" method="post">
<input type="hidden" name="_token" values="[% c.req.param('_token') %]"/>
<input type="submit" name="submit" value="complete"/>
</form>
</body>
</html>

DESCRIPTION

This controller enables to enforce a single transaction across multiple forms. Using a token, you can prevent duplicate submits and protect your app from CSRF atacks.

This module REQUIRES Catalyst::Plugin::Session to store server side token.

ATTRIBUTES

CreateToken

Creates a new token and puts it into request and session. You can return content with request token which should be posted to server.

ValidateToken

After CreateToken, clients will post token request, so you need to validate whether it is correct or not.

The ValidateToken attribute wil make your action validate the request token by comparing it to the session token which is created by the CreateToken attribute.

If the token is valid, the server-side token will be expired. Use is_valid_token() to check wheter the token in this request was valid or not.

RemoveToken

Removes the token from the session. The request token will no longer be valid.

METHODS

All methods must be passed the request context as their first parameter.

token
create_token
remove_token
validate_token

Return whether token is valid or not. This will work correctly only after ValidateToken.

is_valid_token

CONFIGRATION

in your application class:

__PACKAGE__->config('Controller::TokenBasedMyController' => {
    session_name => '_token',
    request_name => '_token',
});
session_name

Default: _token

request_name

Default: _token

validate_stash_name

Default: _token

SEE ALSO

Catalyst::Controller::RequestToken::Action::CreateToken
Catalyst::Controller::RequestToken::Action::ValidateToken
Catalyst
Catalyst::Controller
Catalyst::Plugin::Session
Catalyst::Plugin::FormValidator::Simple

AUTHOR

Hideo Kimura <<hide<at>hide-k.net>>

COPYRIGHT

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

The full text of the license can be found in the LICENSE file included with this module.