令牌与ajax post请求不匹配到子域

时间:2014-11-05 17:30:11

标签: php jquery ajax laravel laravel-4

我正在使用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',

1 个答案:

答案 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);