【发布时间】:2016-05-06 14:13:31
【问题描述】:
我有一套程序都属于同一家公司,我正在尝试开发一个可以在所有程序中持续存在的单一登录/身份验证服务。这个想法是非常面向微服务的,只要有人在其中一个程序中,我们就会有一个服务来处理身份验证并保持它。问题是我需要我的其他服务能够访问所有域中的相同 cookie,并能够将这些 cookie 发送到身份验证服务以进行会话验证。如果这不是使用登录/身份验证服务设置微服务的正确方法,请纠正我。
对于我的前端(Angularjs):
service.login = function (obj, callback) {
$http.post(loginService + "login", obj, {
withCredentials: true
}).success(function (data) {
callback(data);
})
.error(function (data, status, headers) {
console.log(status);
});
};
对于我的服务器(Node、Express、Mongo):
var options = {
pfx: fs.readFileSync('company.pfx'),
passphrase: 'pass',
ca: [fs.readFileSync('gd1.crt'), fs.readFileSync('gd2.crt'), fs.readFileSync('gd3.crt')],
spdy: {
protocols: ['h2', 'spdy/3.1', 'http/1.1'],
plain: false,
'x-forwarded-for': true,
connection: {
windowSize: 1024 * 1024, // Server's window size
// **optional** if true - server will send 3.1 frames on 3.0 *plain* spdy
autoSpdy31: false
}
}
};
var server = spdy.createServer(options, app);
app.use(helmet());
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use("/static", express.static('static'));
app.use("/logins", express.static('logins'));
app.set('trust proxy', 1) // trust first proxy for production with a proxy server
app.use(session({
resave: false,
saveUninitialized: true,
genid: function (req) {
return uuid.v4() // use UUIDs for session IDs
},
name: "myToken",
secret: 'mysecret',
cookie: { secure: false, maxAge: (45 * 60000) }, // set secure to true when in production
store: new mongoStore({ url: 'mongodb://' + base + 'sessions' })
}));
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);//req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH');
res.header('Access-Control-Allow-Headers', 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version');
next();
});
请求:
app.get('/', function (req, res) {
var sess = req.session, token = req.cookies.myToken;
res.send('Hello World!');
});
为了测试这一点,我在我的系统上运行了一个虚拟机,并部署了应用程序,然后我也在运行我的 localhost:/ 应用程序。据我了解,如果我正确设置了 CORS,我的 cookie 在具有相同会话的两个调用之间应该保持不变。有什么帮助或建议吗?
【问题讨论】: