护照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;