当移动服务器到CORS位置时,护照/快速会话认证被破坏

Passport / Express Session Auth Breaking When Moving Server to a CORS Location

本文关键字:会话 认证 护照 服务器 移动 CORS 位置      更新时间:2023-09-26

我正在用angular.js和ionic构建一个应用程序。我将所有前端应用程序内容移到一个包中,并将服务器逻辑移到数字海洋上自己的水滴中。现在前端必须生成CORS。在初始身份验证时,除了express响应上的cookie对象为空之外,一切似乎都很正常。

当它工作时,sans CORS。我得到了这个

 cookies: { 'connect.sid': 's:ZrKJ7BxH2yeAiFG5uTC2FlhpfCa9S17K.oA5bCUQjZbdJBS8ohzngSiOEFzJWCyKxLDlBdEUqhzk' },

现在,当服务器在一个液滴上启动并启用CORS时,我从响应

中得到这个
  cookies: {},

唯一不同的是请求来自CORS。'env'没有在任何一个上设置,所以它们都默认为development。

CORS设置如下:

var allowCrossDomain = function(req, res, next) {
    console.log("In allow cross domain function", req.headers)
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET, POST');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header('Access-Control-Allow-Credentials', true);
    next();
}

在chrome开发人员工具中,我从未在我的资源/cookie选项卡中看到cookie土地,但我在做CORS之前做过……现在肯定是响应被发送回了另一个域,对吧?我想不出还有什么原因会导致passport/express不能像"单域"设置之前那样工作。

编辑:我也会发布快速会话代码,即使这是在移动服务器之前工作。

app.use(session({
    secret: app.getValue('env').SESSION_SECRET,
    store: new MongoStore({mongooseConnection: mongoose.connection}),
    cookie: { maxAge: 60000, secure: false },
    resave: false,
    saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function (user, done) {
    console.log('Passport serializing user =>', user)
    done(null, user._id);
});
passport.deserializeUser(function (id, done) {
    console.log('Received this id => ', id)
    UserModel.findById(id, done);
});

不能为包含cookie的请求设置来源通配符

带有凭据的CORS

重要提示:当响应一个认证请求时,服务器必须指定一个域,不能使用通配符。如果头被通配符为:Access-Control-Allow-Origin: *,上面的例子将失败。

同样如链接所述,您需要将withCredentials: true设置为AJAX请求。