I've set up an hook to implement XSRF in laravel:
view
@section('content')
<div class="content" data-ui-view></div>
<script type="text/javascript">
window.user = <% $data['user'] %>;
document.cookie = "XSRF-TOKEN=<% $data['token'] %>";
</script>
@stop
controller
$token = csrf_token();
$this->layout->content = View::make('home.content')->with('data', array('token'=> $token, 'user'=> json_encode($userData)));
filter
Route::filter('xsrf', function()
{
if((!isset($_COOKIE['XSRF-TOKEN']) || is_null(Request::header('X-XSRF-TOKEN'))) || ($_COOKIE['XSRF-TOKEN'] !== Request::header('X-XSRF-TOKEN'))){
return Response::make('Not Found', 404);
}
});
Route::filter('xhr', function()
{
if(!Request::ajax()){
return Response::make('Not Found', 404);
}
});
route
Route::group(array('prefix' => 'api/v1', 'before' => 'xhr|xsrf'), function() {
/* User */
Route::post('user', array('as' => 'base.user.register', 'uses' => 'App\Controllers\UserController@register'));
});
xhr test
public function testUser404() {
$crawler = $this->client->request('GET', '/api/v1/user');
$this->assertResponseStatus(404);
}
How can I test base.user.register for xsrf filter ?
ENDED UP
protected function getCookieValue()
{
$crawler = $this->client->request('GET', '/');
$text = $crawler->filter('body > div > script')->eq(0)->text();
$chunks1 = explode("\n", trim($text));
$chunks2 = explode("=", trim($chunks1[1]));
return rtrim($chunks2[2], ';"');
}
public function testUser401() {
$_COOKIE['XSRF-TOKEN'] = $this->getCookieValue();
$this->client->setServerParameter('HTTP_X-Requested-With', 'XMLHttpRequest');
$this->client->setServerParameter('HTTP_X-XSRF-TOKEN', $_COOKIE['XSRF-TOKEN']);
$crawler = $this->client->request('GET', '/api/v1/user');
$this->assertResponseStatus(401);
}
it's a lot tricky (I'd love to hear some better ones :) ) but it seems to work