Несоответствие токена CSRF Laravel sanctum и Angular http - PullRequest
0 голосов
/ 06 апреля 2020

Я пытался реализовать Laravel sanctum, но у меня появляется эта ошибка "Несоответствие токена CSRF", хотя я выполнил все, что сказано в документации Laravel Sanctum

cors.php config файл

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

kernal добавлен в соответствии с документацией, поэтому не теряйте места, добавив здесь свой код

.env file

SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost

Я использую Angular 9 в качестве моего внешнего интерфейса здесь

Это мой перехватчик

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

Так я отправляю запрос на Laravel

this.http.get<any>(url('sanctum/csrf-cookie')).subscribe(() => {
     this.http.post<any>(url('login'), { this.username, this.password })
         .subscribe(success => console.log(success), error => console.log(error))
})

Один раз по первому маршруту нажал, я могу подтвердить создание куки, но проблема связана со вторым маршрутом ('/ login')

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вам необходимо отправить 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);
  }
}

0 голосов
/ 11 апреля 2020

Как, например, как вы можете получить токен.

...