我正在使用Laravel框架开发一个Web应用程序。
当我从app.com向api.app.com发送ajax请求并传递app.com上生成的csrf令牌时,我总是得到TokenMismatchException。
问题是对api.app.com的ajax请求正在那里创建一个新会话。 我正在为app.com和api.app.com使用单个laravel安装。
子域路由:
Route::group(array('domain' => 'api.app.com'), function()
{
Route::controller('user', 'MyApp\API\UserController');
});
CSRF过滤器仅适用于POST请求:
Route::when('*', 'csrf', ['post']);
CSRF过滤器:
Route::filter('csrf', function()
{
$token = Input::get('_token');
if (Session::token() != $token)
{
throw new Illuminate\Session\TokenMismatchException;
}
});
我的ajax请求如下所示:
$.ajax({
'url': '//api.app.com/user/hello',
'data': {
fields:'',
'_token': 'output of csrf_token() from app.com'
},
'dataType': 'json',
'type': 'POST'
}).done(done).fail(fail).always(always);
如果我不为我的api使用子域,一切正常。 我使用memcached作为我的会话存储。
修改 我的会话域设置为.app.com。
'domain' => '.app.com',
答案 0 :(得分:0)
我通过发送Access-Control-Allow-Credentials: true
标头并将我的ajax请求功能更改为此来解决了这个问题:
$.ajax({
'url': '//api.app.com/user/hello',
'data': {
fields:'',
'_token': 'output of csrf_token() from app.com'
},
'dataType': 'json',
'type': 'POST',
xhrFields: {
withCredentials: true
}
}).done(done).fail(fail).always(always);