【问题标题】:Cross Domain Cookies with Angularjs, Nodejs, Expressjs, express-sessoion, and Mongo Store使用 Angularjs、Nodejs、Expressjs、express-session 和 Mongo Store 的跨域 Cookie
【发布时间】: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 在具有相同会话的两个调用之间应该保持不变。有什么帮助或建议吗?

【问题讨论】:

    标签: node.js express cookies


    【解决方案1】:

    你试过了吗

    res.header('Access-Control-Allow-Origin', '*.domain') ?

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

    【讨论】:

    • 是的,这适用于子域,但我的程序将在不同的域上运行。
    猜你喜欢
    • 2015-05-28
    • 2012-03-20
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多