禁用cookie时,Laravel 5.1获取TokenMismatchException

时间:2015-11-14 04:29:05

标签: ajax laravel-5 csrf

我使用AJAX PUT请求在我的应用程序中使用RESTfull api:

               $.ajax({
               method: "PUT",
               url: "/device/{{ $client->id }}",
               async: false,
               data: {
                        javascript_enabled: $('#javascript-enabled').text(),
                        cookies_enabled: $('#cookies-enabled').text(),
                        device_pixel_ratio: $('#device-pixel-ratio').text(),
                        screen_resolution: $('#screen-resolution').text(),
                        browser_window: $('#browser-window').text(),
                        local_time: $('#local-time').text(),
                        local_time_zone: $('#local-time-zone').text(),
                        _token: "{{ csrf_token() }}"
                      },
               success: function(data)
                        {
                             alert('success');                          
                        },
            error: function (jqXHR, textStatus, errorThrown)
                   {
                       alert( "Internal server error occurred.");
                   }
           });

当我在浏览器中启用cookie时,此代码可以正常工作。

然而,当我禁用cookie时,我得到“TokenMismatchException”。

我已将此行放入“App \ Http \ Middleware \ VerifyCsrfToken”类中解决了这个问题:

protected $except = [
    'device/*'
];

有没有办法解决这个问题而不禁用csrf检查这条路线?

1 个答案:

答案 0 :(得分:1)

只有在您的请求中出现csrf令牌时,您才可以对令牌进行身份验证,否则您将采用此类替代方式

创建一个您的应用程序可以识别它的自己的令牌

就像有一个像custom_token这样的参数,你应该在

识别

app\Http\Middleware\VerifyCsrfToken.php

提示:如果您执行print_r($request),则可以看到所有元素

您应该像这样验证自定义令牌

$paramExist=  $request->custom_token;
    #return parent::handle($request, $next);
        if(isset($paramExist))
        {
            $yourSpecialkey ='a2$%$'; #This to check whether the param has the value that you set
            if($paramExist==$yourSpecialKey)
            {
                return $next($request);
            }
            else
            {
                return parent::handle($request, $next);
            }

        }   
        else
        {
            return parent::handle($request, $next);
        }

我已经给你这个临时匹配,你将使用自己的方式来匹配/验证你的令牌。