我使用带有快速服务器的Node.js和用于身份验证的护照包。客户端位于同一服务器上,不同的域构建在Backbone.js上。会话是在登录请求时创建的,但如果另一个请求来自客户端,我无法访问会话。
节点服务器配置:
var express = require( 'express' ),
path = require( 'path' ),
mongoose = require( 'mongoose' ),
passport = require('passport'),
cors = require('cors');
app.configure( function() {
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({
secret: secret,
key: key,
cookie : {
maxAge: maxAge
}
}));
app.use(passport.initialize());
app.use(passport.session());
app.use( express.methodOverride() );
app.use( app.router );
app.use( express.static(application_root) );
app.use(cors());
});
登录并验证:
app.post('/login', cors(corsOptions), passport.authenticate('login', {
successRedirect : successDirect,
failureRedirect : failureDirect
}));
function requireAuth(req, res, next) {
if(req.session.user) {
next();
}
else if (req.cookies.isAuthenticated) {
next();
} else {
res.redirect(loginUrl);
}
}
登录时,会话已创建。如果我从服务器端发送任何请求(localhost:9999 / anymethod),则访问会话,相应地做出响应。如果我尝试将客户端的请求发送到同一个URL,则会话始终为“未定义”。
示例:
app.get('/mymethod', cors(corsOptions), requireAuth, function(request, response) {
return response.send("Done");
});
此方法在登录后从服务器访问时有效,但在从客户端访问时无效(客户端在同一服务器,不同域上建立)。
添加到Backbone.js:
initialize: function() {
this.collection.fetch({reset: true, beforeSend: this.beforeFetch});
},
beforeFetch: function(xhr) {
xhr.withCredentials = true;
},...
编辑:来自客户端的请求不包含任何cookie。
如何在登录后访问护照创建的会话,从客户端发送请求?
答案 0 :(得分:0)
我猜cors图书馆就是这样做的(我还没有用过那个图书馆)。但如果它不在服务器端
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,PATCH');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
next();
});
在客户端ajax请求中
xhrFields: {
withCredentials: true
}