首页 文章

发布到路由时,Laravel 5.4 null csrf_token()

提问于
浏览
0

我发送了一个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 回答

  • 0

    检查你的路由组它必须应用 web 中间件

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

    csrf保护由Laravel Forms管理 . 在处理API时它将不可用 .

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

    考虑使用API中间件为您的API;)

  • 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字段添加到每个请求 . 做前两个代码片段,你会没事的 . 我相信的第三个可能是Vue .

    回答你的问题:不,不,不,不 . 我不相信在POST请求中生成的CSRF令牌,它是跨站点引用令牌,而不是身份验证令牌 . 如果您正在寻找认证令牌刷新之类的东西,那么请查看JWT,尽管目前laravel的JWT包有点未完成;通过一点点工作,你可以让他们工作 .

    https://github.com/tymondesigns/jwt-auth 1.0.*@dev非常好 . 然后,您可以使用他们的刷新中间件根据请求生成新令牌,但这是非常先进的,除非它真的很麻烦 .

    我相信Dingo(我相信另一项正在进行的工作)https://github.com/dingo/api使用上述包

    别的什么让我知道!

  • 2

    终于搞清楚了 .

    确实可以在ajax post请求中检查CSRF . 我想确保他们自己网站上的某个人没有成功做任何事情,特别是对另一个用户来说,无法访问我的ajax endpoints .

    但是,我遇到了Laravel操作问题,Laravel设置了会话 . 我试图在构造函数中调用验证方法(在同一个类中),在那里我验证了CSRF并在一个地方验证了请求用户 . 我想这样做,以便每当有人上课时,我都不必在课堂上的每个公共方法中调用验证,我只需要调用一次 .

    但是,csrf_token()和一般的请求会话在我的构造中尚不可用 . 但是,我可以在路径中调用的控制器类中的方法中使用它 .

    例如,给出以下路线:

    Route::post('/test', 'AjaxController@test');
    

    如果我将Request注入到构造中然后尝试引用会话中的任何内容(在构造中),或者获取csrf_token()的值,它将抛出一个错误,因为Laravel还没有设置那些东西 . 但是如果我在测试方法中引用这些东西中的任何一个,它就会存在并且可用 .

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

相关问题