У меня возникает странная проблема в моем веб-приложении angular 6 и nodeJS.
Мне нужно реализовать защиту csrf, поэтому я реализовал csurf в узле js, мой код js узла приведен ниже,
let express=require('express');
let app=express();
var cookieParser = require('cookie-parser')
csrf = require('csurf');
//import body parser
let bodyParser=require('body-parser');
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin","*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,X-XSRF-Token");
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.header('Access-Control-Allow-Credentials', true);
next();
});
app.use(cookieParser('ksdnfjn9834f80sa9asjfasdj'));
app.use(csrf({ cookie: true }));
app.use(function(req, res, next) {
console.info(req.csrfToken());
res.cookie('XSRF-TOKEN', req.csrfToken(),{ httpOnly: false,Path:"/" });
return next();
});
app.use('/api',apiRoutes);
app.use('/admin',adminapiRoutes);
app.listen(3000,function(){
console.info('api is listening on port'+3000);
})
мой код angular js выглядит так, чтобы вызвать запрос отправки api,
this.http.post(this.contact_api_url, {
"name": this.contact_name,
"email": this.contact_email,
"message": this.contact_message
},{withCredentials: true,headers: new HttpHeaders().set('X-XSRF-TOKEN', "token_get_in_cookie" ) }).subscribe((val) => {
this.renderer.removeClass(loda_element,'show');
//var msg=JSON.stringify(val);
alertify.success(val['message']);
this.contact_name = '';
this.contact_email = '';
this.contact_message = '';
grecaptcha.reset();
this.captcha_response = '';
}, error => {
this.renderer.removeClass(loda_element,'show');
alertify.error("Error Occurred. Try Again.");
});
Теперь проблема в том, что он никак не устанавливает заголовок, даже не добавляя какой-либо другой заголовок, который я также добавил ниже кода при импорте
HttpClientXsrfModule.withOptions({
cookieName: 'XSRF-TOKEN',
headerName: 'X-XSRF-TOKEN'
}),
но ничего не работает, это не добавление заголовка X-XSRF-TOKEN, я также реализовал перехватчик, как показано ниже,
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let requestToForward = req;
let token = this.tokenExtractor.getToken() as string;
const headers: any = {};
if (token !== null) {
headers['X-XSRF-TOKEN'] = token; // add it to the header
requestToForward = req.clone({ setHeaders: headers });
}
return next.handle(requestToForward);
}
Я также получаю значение токена, которое устанавливается кодом js узла в XSRF-TOKEN, но заголовок не устанавливается.
Может ли кто-нибудь понять, почему заголовок не установлен в angular 6? Примечание: я работаю на localhost, поэтому nodeJS работает на http: // локальный: 3000, а angular - на http: // локальный: 4200.
cookie установлен идеально, проблема в том, что метод angular 6 http post не устанавливает заголовок, а не только x-xsrf-token, но любой заголовок в HTTP-запросе.
вы тестировали api на стороне сервера вне приложения angular, чтобы подтвердить это?





app.use (cookieParser ()); req.cookies ['Your-Cookie-Name-Here'] ... вы пробовали это?