Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无效的CSRF令牌错误(express.js)_Node.js_Express_Angular_Csrf_X Xsrf Token - Fatal编程技术网

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

Node.js 无效的CSRF令牌错误(express.js),node.js,express,angular,csrf,x-xsrf-token,Node.js,Express,Angular,Csrf,X Xsrf Token,我正在使用节点6.5.0和npm 3.10.3 当我尝试将用户登录到站点时,我收到此无效csrf令牌错误 {禁止错误:无效的csrf令牌 在csrf(/Users/Documents/web new/node_modules/csurf/index.js:113:19) 在redis中存储会话的登录不需要csurf模块()。使用csurf模块,会话ID将存储在redis中,但我无法向客户端返回正确的响应以登录用户。我将Angular2与node/express一起使用。据我所知,Angular

我正在使用节点6.5.0和npm 3.10.3

当我尝试将用户登录到站点时,我收到此
无效csrf令牌
错误

{禁止错误:无效的csrf令牌
在csrf(/Users/Documents/web new/node_modules/csurf/index.js:113:19)

在redis中存储会话的登录不需要csurf模块()。使用csurf模块,会话ID将存储在redis中,但我无法向客户端返回正确的响应以登录用户。我将Angular2与node/express一起使用。据我所知,Angular2在使用HTTP服务时默认支持CSRF/XSRF和CookieXSRFStrategy,因此我需要做的只是配置n节点/快速端。带有网页包开发服务器的Angular2应用程序在
localhost:3000
上运行,而节点/快速服务器在
localhost:3001
上运行。我支持CORS

我可以在
localhost:3000
的devtools中看到名为
XSRF-TOKEN
的cookie

你能推荐我如何修复这个错误吗

//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('/logiuser)
route中将csrf函数作为中间件包含在内

当我将其包括在所有路线中时,模块运行良好。
让csrf=csurf();
应用程序获取('/*',csrf,(请求,回复)=>{
res.sendFile(app.get('indexHTMLPath');
});