[ Catalyst] Catalyst::Controller::RequestToken 0.01 release
あちこちで叫ばれている、むやみやたらにCatalystのPluginを作るべきではない運動。(この辺はトクヒロムさんがキャンペーンを張ってるので一読して方がいいです。)
まー言われていることはもっともで、ComponentでできることはComponentにすべきなわけです。
で、拙作のCatalyst::Plugin::RequestTokenなる代物も一部finilizeを使っているものの、明らかにControllerにするべきなので、C::P::RequestTokenをdeprecateさせてCatalyst::Controller::ReqeustTokenってのをとりあえず作ってCPANでリリースしました。
package MyApp::Controller::Foo;
use base qw(Catalyst::Controller::RequestToken);
sub form :Local {
my ($self, $c) = @_;
$c->stash->{template} = 'form.tt';
$c->forward($c->view('TT'));
}
sub confirm :Local :CreateToken {
my ($self, $c) = @_;
$c->stash->{template} = 'confirm.tt';
$c->forward($c->view('TT'));
}
sub complete :Local :ValidateToken {
my ($self, $c) = @_;
if ($self->validate_token) {
$c->response->body('complete.');
} eles {
$c->response->body('invalid operation.');
}
}
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>
とかすると、トークンにより/foo/confirm -> /foo/complete のトランザクションが保証され、/foo/completeの二重サブミットやCSRF攻撃を防ぐことができます。
Controllerにすることによってfinilizeのフックが出来なくなってprepare_tokenが再現できないのですが、その他はほぼ同じ動きをするし、見た目こっちの方がわかりやすいと思います。
これに伴いCatalyst::Plugin::RequestTokenはdeprecateされたのでご注意ください。



