CSRF令牌不匹配Laravel密室和Angular http

时间:2020-04-06 15:38:04

标签: angular laravel http laravel-sanctum

我一直在尝试实现Laravel Sanctum,但即使我遵循Laravel Sanctum文档中的所有说明,也遇到了错误“ CSRF令牌不匹配”

billing_ind配置文件

cors.php

内核是根据文档添加的,因此不要在此处添加代码来浪费空间

'paths' => [ 'api/*', 'login', 'logout', 'sanctum/csrf-cookie' ], 'supports_credentials' => true, 文件

.env

我在这里使用Angular 9作为我的前端

这是我的拦截器

SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost

这是我向Laravel发送请求的方式

request = request.clone({
    withCredentials: true
})

点击第一条路径后,我可以确认创建cookie,但是问题出在第二条路径('/ login')上

4 个答案:

答案 0 :(得分:1)

您需要在标题中发送x-csrf-token(Angular仅在相对URL中自动包含它,而不是绝对的)

您可以创建一个解释器来执行此操作,类似这样的方法应该起作用:

import {Injectable} from '@angular/core';
import {
  HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpXsrfTokenExtractor
} from '@angular/common/http';

import { Observable } from 'rxjs';

@Injectable()
export class HttpXsrfInterceptor implements HttpInterceptor {
  headerName = 'X-XSRF-TOKEN';

  constructor(private tokenService: HttpXsrfTokenExtractor) {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    if (req.method === 'GET' || req.method === 'HEAD') {
      return next.handle(req);
    }

    const token = this.tokenService.getToken();

    // Be careful not to overwrite an existing header of the same name.
    if (token !== null && !req.headers.has(this.headerName)) {
      req = req.clone({headers: req.headers.set(this.headerName, token)});
    }
    return next.handle(req);
  }
}

答案 1 :(得分:1)

我能够通过在 http:// 中的 localhost 之前添加 config/sanctum.php 来解决此问题

从这里

'stateful' => explode(',', env(
        'SANCTUM_STATEFUL_DOMAINS',
        'localhost,127.0.0.1'
)),

为此

'stateful' => explode(',', env(
            'SANCTUM_STATEFUL_DOMAINS',
            'http://localhost,127.0.0.1'
    )),

答案 2 :(得分:0)

我的问题是我正在访问端口8001上的api。当我将它(127.0.0.1:8001)添加到config / sanctum.php中的“有状态”时,它可以工作。

答案 3 :(得分:0)

就我而言,这个问题以一种奇怪的方式解决了。我去了 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken 文件,在“if case”中的“handle”方法的第 76 行有这样一行:

$this->tokensMatch($request);

出于测试目的,我返回了这个字符串

return response()->json($this->tokensMatch($request));

令人惊讶的是它会返回一个普通的令牌。然后我把所有东西都放回原处,很奇怪,但这个错误不再存在。

相关问题