CSRF令牌不匹配 | Laravel 5.4

7
每当我向服务器发送POST请求时,都会出现TokenMismatchException错误。我已经尝试发送了。
<input type="hidden" name="_token" value= "{{csrf_token()}}">

之前,我使用ajaxHeader将这个特定的信息发送给服务器,但也出现了相同的错误。

我调试了更多,并在VerifyCsrfToken文件中找到了问题所在。

protected function tokensMatch($request)
    {
        $token = $this->getTokenFromRequest($request);
        return is_string($request->session()->token()) &&
               is_string($token) &&
               hash_equals($request->session()->token(), $token);
    } 

array:3 [
 "sessionToken" => "rgicYLOUhb2kLLChpVByNLQO1KVMb0Gkjzb7ZtTN" //$request->session()->token()
 "requestToken" => "IgXWquvnfujZJ1Vs9vbSgpjgX3rAnd5PpeklRvBD"  // $request->input('_token') ?: $request->header('X-CSRF-TOKEN')
 "laravel_token" => "rgicYLOUhb2kLLChpVByNLQO1KVMb0Gkjzb7ZtTN" //csrf_token()
]

我在中间件token匹配函数中获取到了上述数组。请问有人能告诉我这个问题的原因和解决方案吗?以下是我使用的ajax代码:

function likeReview(id)
    {
        var like_span = $('#like_'+id);
        var like_div  = $('#likeDiv_'+id);
        var like_span_text = $('#likeText_'+id);
        $.ajax({
            type: 'post',
            url: '{{route('like.review')}}',
            data: {review_id: id},
            beforeSend: function () {
            },
            success: function (data) {
                if(data.status == 'success')
                {
                    var like = like_span.html();
                    var sum  = 0;
                    if(data.like == 1){
                        sum = parseInt(like)+1;
                        like_div.addClass('upvoted-active');
                        like_span_text.html('UPVOTED');
                    } else {
                        sum = parseInt(like)-1;
                        like_div.removeClass('upvoted-active');
                        like_span_text.html('UPVOTE');
                    }
                    like_span.html(sum);
                }
            },
            error: function (xhr, textStatus, thrownError) {
                alert('Something went wrong. Please try again!');
            }
        });
    }

在点击点赞按钮时调用该函数。

<div class="js-btn-thank-area upvoted-active js-activity-root" id="likeDiv_{{$review->id}}">
    <a href="javascript:;" onclick="likeReview({{$review->id}})" class="thank-btn">
    <i class="fa fa-arrow-up fa-fw"></i>
    <span class="feed-action-text" id="likeText_{{$review->id}}">UPVOTED</span>
   </a>
   <div class="stats-thanks" id="like_{{$review->id}}">                                                                    
    {{$review->likes()->where('like','=',1)->count()}}
   </div>
 </div>

发布你的代码。你如何发送数据? - Anar Bayramov
1
请在您遇到问题的地方发布表单提交和ajax代码。 - Mayank Pandeyz
2
你是否查看过 https://laravel.com/docs/5.4/csrf#csrf-x-csrf-token? - Nigel Ren
你在使用表单进行发布吗? - Exprator
1
我的意思是Ajax不使用表单,而是进行自己的提交。我认为你需要将data: {review_id: id},更改为data: {review_id: id, _token: {{ csrf_token() }}},。Nigel的答案也应该可以工作。 - mrjink
显示剩余6条评论
1个回答

2

仅仅将CSRF作为AJAX提交的一个字段并不能起到作用;

$.ajaxSetup({ headers: { 'csrftoken' : '{{ csrf_token() }}' } });

在发起ajax调用之前,请先进行设置 :)! 编辑: 您还可以将数据放入ajax请求的数据部分;
data: {
    review_id: id,
    "_token": "{{ csrf_token() }}"
}

编辑:为了澄清,在聊天中清除storage中的临时数据可以解决此问题。


已经尝试了你提到的两种方法,仍然无法工作。 - Shwetank
我没听懂你的意思,能否再具体一些? - Shwetank
删除此内容:<input type="hidden" name="_token" value= "{{csrf_token()}}">,然后使用我提供的更改之一,如果仍然有问题,请打印出响应。 - Robert Pounder
它不起作用了,我已经尝试过了。如果你现在有空的话,我们可以聊一下。- Robert Pounder - Shwetank
2
我没有足够的积分来聊天。我正在努力。我的同事正在聊天,请回复他。 - Shwetank
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接