无效的CSRF令牌错误(express.js)

我正在使用node 6.5.0npm 3.10.3

当我尝试将用户login到网站时,出现此invalid csrf token错误。

{ ForbiddenError: invalid csrf token at csrf (/Users/Documents/web-new/node_modules/csurf/index.js:113:19)

在redis中存储会话的login不需要csurf模块( https://github.com/expressjs/csurf )。 使用csurf模块,会话ID已经存储在redis中,但是我无法将正确的响应返回给客户端以login用户。 我正在使用Angular2和node / express。 据我所知,Angular2在使用HTTP服务时默认支持CookieXSRFStrategy的CSRF / XSRF,所以我只需要在node / express端configuration一些东西。 使用webpack-dev-server的Angular2应用程序在localhost:3000上运行,而节点/ express服务器在localhost:3001上运行。 我支持CORS。

我能够在localhost:3000 devtools中看到名为XSRF-TOKEN cookie。

你可以build议我怎么解决这个错误?

//cors-middleware.js

 var corsOptions = { origin: 'http://localhost:3000', credentials:true } app.use(cors(corsOptions)); app.use(function(req, res, next) { res.setHeader('Content-Type','application/json'); next(); }) }; 

//index.js

 import path from 'path'; import session from 'express-session'; import connectRedis from 'connect-redis'; import rp from 'request-promise'; import * as _ from 'lodash'; import cors from 'cors'; import csurf from 'csurf'; const redisStore = connectRedis(session); const dbStore = new redisStore(db); let baseUrl = app.getValue('baseUrl'); /* ~~ api authentication ~~ */ let options = { method: 'POST', url: `${baseUrl}/authenticate`, rejectUnauthorized: false, qs: { username: 'someUsername', key: 'someKey' }, json: true }; rp(options) .then(response => { let apiToken = response.response; app.setValue("token", apiToken); }) .catch(err => { console.error(err); }); /* ~~ configure session ~~ */ app.use(session({ secret: app.getValue('env').SESSION_SECRET, store: dbStore, saveUninitialized: false, resave: false, rolling: true, cookie: { maxAge: 1000 * 60 * 30 // in milliseconds; 30 min } })); /* ~~ login user ~~ */ let csrf = csurf(); app.post('/loginUser', csrf, (req, res, next) => { let user = {}; let loginOptions = { method: 'POST', url: `${baseUrl}/client/login`, rejectUnauthorized: false, qs: { token: app.getValue('token'), email: req.body.email, password: req.body.password }, headers: { 'Content-Type': 'application/json' }, json: true }; rp(loginOptions) .then(response => { let userToken = response.response.token; let clientId = response.response.clientId; req.session.key = req.session.id; user.userToken = userToken; user.clientId = clientId; let clientAttributeOptions = { url: `${baseUrl}/client/${clientId}/namevalue`, rejectUnauthorized: false, qs: { token: app.getValue('token'), usertoken: userToken }, json: true }; return rp(clientAttributeOptions); }) .then(response => { req.session.user = user; res.send({user:user}) }) .catch(err => { next(err); }) }); 

我的问题是,我只在app.post('/loginUser)path中包含csrf函数作为中间件。

当我将它包含在所有路线中时,模块工作正常。
let csrf = csurf(); app.get('/*', csrf, (req, res) => { res.sendFile(app.get('indexHTMLPath')); });