没有CSRF令牌,Laravel API无法正常工作(并且标头在全球范围内都在困扰我)

时间:2019-01-24 14:55:36

标签: laravel laravel-passport

我正在尝试在Laravel项目中设置一个API,我想在自己的项目中使用Javascript来使用。该API是无状态的,因此我的理解是当请求该API时,CRSF令牌变得无关紧要。我遇到以下两个问题:

  1. 当我尝试发送不带X-CSRF-TOKEN标头的请求时,我得到401未经授权

  2. 似乎是标题未正确应用于响应的问题

请求从子域client.site.test到子域api.site.test发出。我已通过将“ InternalCORS”中间件应用于我的API路由来确保CORS被授权。

中间件-应用于所有API路由

class InternalCors {
    public function handle($request, Closure $next) {
        header('Access-Control-Allow-Origin:  https://client.site.test');
        header('Access-Control-Allow-Headers:  Content-Type, X-Auth-Token, X-CSRF-Token, X-Requested-With, Authorization, Origin');
        header('Access-Control-Allow-Methods:  GET, POST, PUT');
        header('Access-Control-Allow-Credentials: true');
        return $next($request);
    }
}

API路由

Route::middleware('auth:api')->get('/testApi', function (Request $request) {
    return response()->json($request->user()->fullName(), 200);
})->name('testApi');

Ajax查询

window.$.ajax({
    headers: {
        'Accept': 'application/json',
        'X-Requested-With': 'XMLHttpRequest'
    },
    xhrFields: {
       withCredentials: true
    },
    type: 'GET',
    url: 'https://api.site.test/testApi',
    success: function (response) {
        console.log(response);
    },
    error: function (xhr) {
        console.error(xhr.responseText);
    }
});

现在, even 与中间件明确授权“凭据”,我得到一个回应,说标头设置为不是“”,而不是“ true”。因此,我在顶部添加了Nginx指令:

add_header Access-Control-Allow-Credentials "true";

使用上述设置,对请求的响应为“ 401未经授权”。我已经仔细检查过,默认情况下, web 路由中仅包含VerifyCsrfToken中间件,而不是 api

我想说的是,将CRSF令牌添加到ajax查询中可以解决此问题,但是并不那么简单。似乎有3个标头会影响响应我得到

[CSRF]:是否在Ajax请求中发送X-CSRF-TOKEN标头

[MIDD HEADER]:是否在API路由的中间件中包含header('Access-Control-Allow-Credentials: true');

[NGINX HEADER]:我是否在服务器的API路由配置中包括add_header Access-Control-Allow-Credentials "true";

以下是对Ajax查询的响应的摘要,具体取决于设置的标题:

[CSRF] [MIDD HEADER] [NGINX HEADER] value of the 'Access-Control-Allow-Credentials' header in the response is ''

[CSRF] [MIDD HEADER] [NGINX HEADER]:value of the 'Access-Control-Allow-Credentials' header in the response is 'true, true'

[CSRF] [MIDD HEADER] [NGINX HEADER]:200 - John Smith

[CSRF] [MIDD HEADER] [NGINX HEADER] value of the 'Access-Control-Allow-Credentials' header in the response is ''

[CSRF] [MIDD HEADER] [NGINX HEADER]:401 Unauthorized

[CSRF] [MIDD HEADER] [NGINX HEADER]:value of the 'Access-Control-Allow-Credentials' header in the response is ''

我在这里不知所措...

1 个答案:

答案 0 :(得分:1)

您可以通过编辑在一些路由上禁用CSRF。

App\Http\Middleware\VerifyCsrfToken 

并在受保护的位置添加您自己的路线名称

$except = [] array.

您可以查看更多here