我发送了一个ajax post请求,并且使用Laravel似乎是通过为它创建一个post路由来完成的 . 我已经设置好了,所以使用ajaxSetup将csrf令牌自动放入每个ajax请求的头文件中 . 我试图在后端捕获该标头并验证令牌是否匹配 .
在我的Web路由(自动使用Web中间件)中,这将按预期返回:
Route::get('/test', function() {
return csrf_token();
});
但是,当我通过AJAX发布到路线时,就像下面的方式之一:
尝试1:
Route::post('/test', 'AjaxController@test');
在AjaxController构造中,后跟视图中的警报:
var_dump(csrf_token().',hi'); die;
回复:',hi'(csrf_token为null) .
尝试2:
Route::post('/test', ['test' => csrf_token().',hi', 'uses' => 'AjaxController@test']);
$test = $request->route()->getAction()['test'];
var_dump($test); die;
回复:',hi'(csrf_token为null) .
我似乎遇到的是,在我的帖子请求中填充了get请求csrf_token(),但事实并非如此 .
有任何想法吗?
4 回答
检查你的路由组它必须应用
web
中间件csrf保护由Laravel Forms管理 . 在处理API时它将不可用 .
您应该看看Laravel中如何使用中间件https://laravel.com/docs/5.4/middleware
考虑使用API中间件为您的API;)
如果您运行此命令
php artisan make:auth
在此处记录https://laravel.com/docs/5.4/authentication#authentication-quickstart,当您转到resources/views/layouts/app.blade.php
时,您会看到:并在app.js
在5.3中有这个很酷的功能,看起来好像已经在5.4中删除了 .
所以你需要做的是将csrf字段添加到每个请求 . 做前两个代码片段,你会没事的 . 我相信的第三个可能是Vue .
回答你的问题:不,不,不,不 . 我不相信在POST请求中生成的CSRF令牌,它是跨站点引用令牌,而不是身份验证令牌 . 如果您正在寻找认证令牌刷新之类的东西,那么请查看JWT,尽管目前laravel的JWT包有点未完成;通过一点点工作,你可以让他们工作 .
https://github.com/tymondesigns/jwt-auth 1.0.*@dev非常好 . 然后,您可以使用他们的刷新中间件根据请求生成新令牌,但这是非常先进的,除非它真的很麻烦 .
我相信Dingo(我相信另一项正在进行的工作)https://github.com/dingo/api使用上述包
别的什么让我知道!
终于搞清楚了 .
确实可以在ajax post请求中检查CSRF . 我想确保他们自己网站上的某个人没有成功做任何事情,特别是对另一个用户来说,无法访问我的ajax endpoints .
但是,我遇到了Laravel操作问题,Laravel设置了会话 . 我试图在构造函数中调用验证方法(在同一个类中),在那里我验证了CSRF并在一个地方验证了请求用户 . 我想这样做,以便每当有人上课时,我都不必在课堂上的每个公共方法中调用验证,我只需要调用一次 .
但是,csrf_token()和一般的请求会话在我的构造中尚不可用 . 但是,我可以在路径中调用的控制器类中的方法中使用它 .
例如,给出以下路线:
如果我将Request注入到构造中然后尝试引用会话中的任何内容(在构造中),或者获取csrf_token()的值,它将抛出一个错误,因为Laravel还没有设置那些东西 . 但是如果我在测试方法中引用这些东西中的任何一个,它就会存在并且可用 .
有点奇怪的Laravel操作顺序问题 .