标头 Laravel 5.3 + Angular2 中不允许 X-XSRF-TOKEN

Posted

技术标签:

【中文标题】标头 Laravel 5.3 + Angular2 中不允许 X-XSRF-TOKEN【英文标题】:X-XSRF-TOKEN not allowed in headers Laravel 5.3 + Angular2 【发布时间】:2017-05-14 10:03:23 【问题描述】:

当我发出 post 请求时,服务器给我以下错误:'XMLHttpRequest cannot load http://localhost/pets2homeback/public/register.预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 X-XSRF-TOKEN。 我关注了您的帖子,但我无法在 Access-Control-Allow-Headers 中允许此 X-XSRF-TOKEN 并且我不太明白这个问题,因为路由是一个寄存器,所以没有令牌,我真的不知道问题出在哪里。

这是我的 kernel.php(重点)

protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\Cors::class,
\App\Http\Middleware\VerifyCsrfToken::class];

这是我的 cors.php

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)

    return $next($request)
        ->header("Access-Control-Allow-Origin","*")
        ->header('Access-Control-Allow-Headers', '*')
        ->header('Allow', 'GET, POST, PUT, DELETE, OPTIONS')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

这是我的 routes.php(在 Laravel 5.3 中是 web.php)

header('Access-Control-Allow-Origin','http://localhost');
header('Access-Control-Allow-Credentials', 'true');
Route::get('/', 'IndexController@getIndex');
Route::post('/login',  [ 'uses' => 'LoginController@loginAction']);
Route::post('/register', [ 'uses' => 'UserController@register']);

这是我在 Angular2 中的服务。

  register(input)
let params = JSON.stringify(input);
let headers = new Headers('Content-Type':'application/x-www-form-urlencoded; charset=UTF-8');
return this._http.post(this.url+"register", params,headers: headers)
  .map(res => res.json())

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。不是 Laravel,而是 PHP 背景。

对我来说解决问题的是这样定义标题:

header('Access-Control-Allow-Headers: Content-Type, x-xsrf-token, x_csrftoken');

Angular 只使用了XSRF-Token,但不知何故我不得不同时定义两者。

希望对你有帮助。

【讨论】:

'*' 不起作用?你的意思是我们需要手动定义标题?

以上是关于标头 Laravel 5.3 + Angular2 中不允许 X-XSRF-TOKEN的主要内容,如果未能解决你的问题,请参考以下文章

从 curl 使用 Auth0 调用 Laravel 5.3 API 时未经授权的用户

Angular2 - HTTP RequestOptions 标头

Angular2 Spring Boot JWT 缺少响应标头

如何在 Angular2 中设置全局自定义标头?

Angular2:angular-http 标头非常奇怪的行为

Angular2 中的 Apollo 客户端自定义标头和附加变量