我正在使用 Angular 6 为前端和 Adonisjs 为后端创建一个 SPA。
现在我陷入了csrf的问题。如果我在 adonis/config/shield.js 中禁用 csrf,我已经完成了我的任务。但是,我不想禁用 csrf。
我在互联网上遵循了一些关于使用 Angular HttpInterceptor 的建议,但仍然无法正常工作。
这是 shield.js 中的 csrf 配置
csrf: {
enable: true,
methods: ['POST', 'PUT', 'DELETE'],
filterUris: ['/api/auth/signin'],
cookieOptions: {
httpOnly: false,
sameSite: true,
path: '/',
maxAge: 7200
}
// compareHostAndOrigin: true}
这是我的 token-interceptor.service.ts
import { Injectable } from '@angular/core';
import {
HttpClientXsrfModule,
HttpInterceptor,
HttpXsrfTokenExtractor,
HttpRequest,
HttpHandler,
HttpEvent
} from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class TokenInterceptorService implements HttpInterceptor {
constructor(private tokenExtractor: HttpXsrfTokenExtractor) {}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
const headerName = 'XSRF-TOKEN';
const respHeaderName = 'X-XSRF-TOKEN';
const token = this.tokenExtractor.getToken() as string;
if (token !== null && !req.headers.has(headerName)) {
req = req.clone({ headers: req.headers.set(respHeaderName, token) });
}
return next.handle(req);
}
}
而且我不知道Angular是否拦截了Http。因为根据我的请求,我没有看到任何 X-XSRF-TOKEN 标头。
而且我仍然对 Adonisjs 使用的令牌感到困惑。因为当我登录并console.log(request.csrfToken)
得到一个值但该值与数据库中的令牌不同(我使用 mongoDB)。
我应该从一开始就打开我的应用程序就获得 csrf 吗?或者是其他东西?
请建议我如何解决它。