没有CSRF检查的外部api的Ajax GET

时间:2017-04-21 10:56:24

标签: ajax laravel cors laravel-5.3 csrf-protection

在我的laravel 5.3应用程序中,我已为所有ajax请求全局启用CSRF检查。

 $.ajaxSetup({
        headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') }
    });

但是我有一个外部api的ajax GET请求如下。

  $.ajax({
        url: "https://api.xxxxxxxxxxx/v1/" +code+ "?api_key="+API_KEY,
        type: "GET",
        dataType: "text",
        success: function (data) {
        },
        error: function (msg) {
        }
    });

我需要在这里避免CSRF检查。我试过两种方法,但没有什么对我有用。在VerifyCsrfToken.php第一路

class VerifyCsrfToken extends BaseVerifier
{
    protected $except = [
        'https://api.xxxxxxxxx/v1/*'
    ];
}

第二路

class VerifyCsrfToken extends BaseVerifier
{
        if ( ! $request->is('https://api.xxxxxxxxx/v1/*'))
        {
                return parent::handle($request, $next);
        }

            return $next($request);

}

请弄明白,如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

最后,我在javascript内找到了一条路。我们可以在ajax调用之前删除特定标头,然后再次重新分配标头。

delete $.ajaxSettings.headers["X-CSRF-Token"];

    $.ajax({
            url: "https://api.xxxxxxxxxxx/v1/" +code+ "?api_key="+API_KEY,
            type: "GET",
            dataType: "text",
            success: function (data) {
            },
            error: function (msg) {
            }
        });

$.ajaxSettings.headers["X-CSRF-Token"] = $('meta[name=_token]').attr('content');

答案 1 :(得分:0)

您可以像这样覆盖ajaxSetup来电中的ajax

$.ajax({
    url: "https://api.xxxxxxxxxxx/v1/" +code+ "?api_key="+API_KEY,
    type: "GET",
    dataType: "text",
    headers : {},
    success: function (data) {
    },
    error: function (msg) {
    }
});

虽然,您不应该使用ajaxSetup

  

此处指定的设置将影响对$ .ajax或基于Ajax的衍生产品(如$ .get())的所有调用。 这会导致不良行为,因为其他呼叫者(例如,插件)可能需要正常的默认设置。出于这个原因,我们强烈建议不要使用此API。相反,在调用中显式设置选项或定义一个简单的插件来执行此操作。 :https://api.jquery.com/jquery.ajaxsetup/

答案 2 :(得分:0)

这应该有帮助

{{1}}