2017-06-06 150 views
0

我正在发送一个ajax post请求,并且通过为Laravel创建post路径来完成此操作。我已经设置好了,因此每个使用ajaxSetup的ajax请求都会在自动标题中放置一个csrf标记。我试图在后端捕获该头并验证令牌是否匹配。Laravel 5.4 null csrf_token()发布到路由

在我的网络的路由(自动使用Web中间件),这将返回预期:

Route::get('/test', function() { 
    return csrf_token(); 
}); 

然而,当我发布到通过AJAX的路线,像任一下面的方法:

尝试1:

Route::post('/test', '[email protected]'); 

在AjaxController构造,接着警报在视图中:

var_dump(csrf_token().',hi'); die; 

回应:',嗨'(csrf_token为空)。

尝试2:

Route::post('/test', ['test' => csrf_token().',hi', 'uses' => '[email protected]']); 

$test = $request->route()->getAction()['test']; 
var_dump($test); die; 

响应: '在'(csrf_token为空)。

我似乎碰到的是,在请求csrf_token()被填充的情况下,在我的post请求中,它不是。

任何想法?

+0

不确定如果你知道这一点,但在'app.js'和/或'layouts/app.blade.php'文件中应该有一个JS脚本,它将csrf_token添加到你的api请求标题中。如果没有,我会调查,以确保它。避免需要检索它,因为你有效地做的是请求一个csrf并同时清除一个,因此csrf是无效的。如果有任何意义... – sourRaspberri

+0

我已经更新我的问题更具体 –

回答

0

终于明白了这一点。

确实可以在ajax发布请求上检查CSRF。我想确保他们自己网站上的某个人没有成功做任何事情,特别是对于其他用户,我的ajax终端没有成功。

但是,我遇到了Laravel操作问题顺序,Laravel设置了会话。我试图在构造函数中调用一个验证方法(在同一个类中),我在那里验证了CSRF并在一个地方验证了请求用户。我希望这样做,以便任何时候有人打这个班,我不必在班上的每个公开方法中调用验证,我只需要调用一次。

但是,csrf_token()和通常的请求会话在我的结构中还不适用于我。但是,我可以在路由中调用的控制器类中的方法中使用它。

例如,给出以下路线:

Route::post('/test', '[email protected]'); 

如果我注射请求到结构,然后试图引用会话东西(在构造),或获得csrf_token的值()它会抛出一个错误,因为Laravel还没有设置这些东西。但是如果我在测试方法中引用其中的任何一种,它就会在那里并且可以很好地使用。

有点奇怪的Laravel操作顺序问题。

0

csrf保护由Laravel Forms管理。处理API时不可用。

你应该看看中间件是如何在Laravel 使用https://laravel.com/docs/5.4/middleware

想到用你的API的API中间件;)

+0

我没有在我原来的帖子(现在编辑)提到该职位是ajax请求,所以csrf令牌放入标题在ajaxSetup中,然后在服务器端验证它。我一直在读的东西似乎告诉我,我应该能够将它放在标题中,然后在后端进行验证。 –

0

检查你的路线组必须应用web中间件作为

Route::group(['middleware' => 'web'], function() { 
    Route::get('/test', function() { 
     return csrf_token(); 
     //or return $request->session()->token(); 
    }); 
}); 
+0

从特定版本(5.2.something)开始,现在自动完成。 –

0

如果你运行这个命令php artisan make:auth这里记录https://laravel.com/docs/5.4/authentication#authentication-quickstart当你去resources/views/layouts/app.blade.php你会看到这个:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

而且在app.js

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN':$('meta[name="csrf-token"]').attr('content') 
    } 
}); 

在5.3有这个实用的功能,看起来好像已经被5.4去除。

<script> 
    window.Laravel = <?php echo json_encode([ 
     'csrfToken' => csrf_token(), 
    ]); ?> 
</script> 

所以你需要做的是将csrf字段添加到每个请求。做前2个代码片段,你会没事的。我相信第三个可能是Vue。

回答你的问题:不,不,不,不。 CSRF令牌我不相信会在POST请求中生成,它是一个跨站点引用令牌,而不是身份验证令牌。如果你正在寻找认证令牌刷新之类的东西,然后结账智威汤逊,尽管目前还没有完成JWT for laravel的软件包;有一点工作,你可以让他们工作。

https://github.com/tymondesigns/jwt-auth 1.0.*@dev很不错。然后你可以使用它们的刷新中间件来根据请求产生新的令牌,但是这是相当先进的,除非它用于认证,否则我不会真的打扰。

我认为巴丁格(另一个正在进行的工作,我相信)https://github.com/dingo/api使用上述包装

还有什么让我知道!