使用Angularjs,Nodejs,Expressjs,express-sessoion和Mongo Store的跨域Cookie

时间:2016-05-06 14:13:31

标签: node.js express cookies

我有一套程序都属于同一家公司,我正在尝试开发一个可以持续通过所有程序的单一登录/身份验证服务。这个想法是非常面向微服务的,我们将有一个服务来处理身份验证并持久化,只要有人在其中一个程序中。问题是我需要我的其他服务才能在所有域中访问相同的cookie,并能够将这些cookie发送到auth服务进行会话验证。如果这不是使用登录/验证服务设置微服务的正确方法,请纠正我。

对于我的前端(Angularjs):

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();
});

对于我的服务器(Node,Express,Mongo):

app.get('/', function (req, res) {
    var sess = req.session, token = req.cookies.myToken;
    res.send('Hello World!');
});

请求:

var prices = document.getElementsByClassName('amount');
var price_array = [];

for (i= 0; i < prices.length; ++i) {
    price_array.push(prices[i].innerHTML);
}

document.write(" | " + price_array);

为了测试这个,我在部署了应用程序的系统上运行了一个虚拟机,然后我也运行了我的localhost:/ application。根据我的理解,如果我正确设置CORS,我的cookie应该在具有相同会话的两个调用之间保持相同。有任何帮助或建议吗?

1 个答案:

答案 0 :(得分:0)

你试过吗

res.header(&#39; Access-Control-Allow-Origin&#39;,&#39; *。域名&#39;)?

基本上是匹配主域下任何子域的通配符。