将服务器移动到CORS位置时,Passport / Express会话身份验证失败

时间:2015-09-06 14:39:44

标签: javascript angularjs cookies express cors

我正在使用angular.js和ionic建立一个应用程序。我将所有前端应用程序内容移动到一个包中,并将服务器逻辑移动到数字海洋上它自己的Droplet。现在前端必须制作CORS。在初始身份验证时,一切似乎都运行良好,除了快递响应中的cookie对象为空。

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

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

现在,当服务器启用Droplet并启用CORS时,我会从响应

中获取此信息
  cookies: {},

唯一可能不同的是请求来自CORS。 'env'没有在任何一个上设置,因此它们都默认为开发。

我所拥有的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之前就已经做过了...现在必须将响应发送回另一个域吗?我想不出任何会导致护照/快递无法按照“单域”设置之前的方式工作的其他内容。

编辑:我也会发布快递会话代码,即使这在移动服务器之前有效。

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

1 个答案:

答案 0 :(得分:2)

您无法为包含Cookie的请求设置原始通配符。

CORS with credentials

  

重要说明:在响应凭证请求时,服务器必须指定域,并且不能使用通配符。如果标头被通配为:Access-Control-Allow-Origin:*,则上述示例将失败。

另外,在链接说明中,您需要将withCredentials: true设置为您的AJAX请求。