护照js无法在跨网域中维护会话

我正在使用护照JS,快速和mongoose做一个API。 当我在同一个域中testing它时,它保持会话并正常工作。 但是在跨域,它失败了。 任何线索如何维护会议跨域使用相同的configuration。 以下是代码

allowCrossDomain = function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); res.header("Access-Control-Allow-Headers", req.headers["access-control-request-headers"]); // res.header("Access-Control-Allow-Credentials", "true"); if ("OPTIONS" == req.method) { res.send(200); } else { next(); } //allow all crossDomain request app.use(allowCrossDomain); //session handling app.use(express.cookieParser("gallery")); app.use(express.session()); app.use(passport.initialize()); app.use(passport.session()); app.use(function(req, res, next) { // check if client sent cookie var cookie = req.cookies.cokkieName; if (cookie === undefined) { //set up cookie here by a random number }); } next(); // <-- important! }); passport.use(new LocalStrategy({ usernameField: "email" }, function(email, password, done) { User.authenticate(email, password, function(err, reply) { //authenticate user and call the callback return done(err, false); }); })); passport.serializeUser(function(user, done) { return done(null, user._id); }); passport.deserializeUser(function(id, done) { //find user via id and return the user details return done(null, user._id); }); app.post("/login", function(req, res, next) { passport.authenticate("local", function(err, data, info) { //custom callback user.getProfile(req, res, next, err, data, info); })(req, res, next); }); 

我遇到了同样的问题。 在快速应用程序中configuration任何内容之前,请使用以下内容(完全相同)设置跨域响应的标题:

 app.use(function(req, res, next) { res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Origin', req.headers.origin); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); if ('OPTIONS' == req.method) { res.send(200); } else { next(); } }); 

这个对我有用。 祝你好运!

按照Sriharsha的回答:

  • 设置res.header("Access-Control-Allow-Credentials", "true");

  • 确保您在客户端通话中传递凭证。 例如对于AJAX,添加到您的电话: xhrFields: {withCredentials: true},

另外:

  • 访问控制允许来源与凭证请求不要使用通配符

    正如MDN所解释的那样 :

    当响应有证书请求时,服务器必须指定一个域,并且不能使用通配


我使用这个文件,并使用require("./enable-cors.js")(app);从我的主模块中调用它require("./enable-cors.js")(app);

 // enable-cors.js module.exports = function(app) { var methodOverride = require('method-override') app.use(methodOverride()); var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Origin', req.headers.origin); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // intercept OPTIONS method if ('OPTIONS' == req.method) { res.send(200); } else { next(); } }; app.use(allowCrossDomain); // Built upon: http://cuppster.com/2012/04/10/cors-middleware-for-node-js-and-express/#sthash.WdJmNaRA.dpuf }; 

通过设置Access-Control-Allow-Credentials标头允许共享凭证 。 (我不知道为什么你在你的代码中注释)

 res.header("Access-Control-Allow-Credentials", "true"); 

然后通过XHR对象从JavaScript 传递证书 。

 xhr.withCredentials = true;