Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将服务器移动到CORS位置时Passport/Express会话身份验证中断_Javascript_Angularjs_Cookies_Express_Cors - Fatal编程技术网

Javascript 将服务器移动到CORS位置时Passport/Express会话身份验证中断

Javascript 将服务器移动到CORS位置时Passport/Express会话身份验证中断,javascript,angularjs,cookies,express,cors,Javascript,Angularjs,Cookies,Express,Cors,我正在用angular.js和ionic构建一个应用程序。我把所有的前端应用程序都放到了一个软件包中,并将服务器逻辑移到了它自己的digital ocean上。现在前端必须制作CORS。在初始身份验证时,除了来自express的响应上的cookies对象为空之外,其他一切似乎都正常工作 当它起作用时,sans CORS。我知道了 cookies: { 'connect.sid': 's:ZrKJ7BxH2yeAiFG5uTC2FlhpfCa9S17K.oA5bCUQjZbdJBS8ohzngS

我正在用angular.js和ionic构建一个应用程序。我把所有的前端应用程序都放到了一个软件包中,并将服务器逻辑移到了它自己的digital ocean上。现在前端必须制作CORS。在初始身份验证时,除了来自express的响应上的cookies对象为空之外,其他一切似乎都正常工作

当它起作用时,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开发者工具中,我从未在我的资源/cookies选项卡中看到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的请求的源设置通配符

重要注意事项:当响应认证请求时,服务器必须指定域,并且不能使用通配符。如果标题通配符为:Access Control Allow Origin:*,则上述示例将失败


正如链接所指出的,您还需要为AJAX请求设置
withCredentials:true

谢谢!我没有意识到这种情况,尽管还有一些其他问题没有提到。所以,如果我的客户端来自一个应用程序——(也就是说,每个人都有不同的设备,因此来源不同,我可以不依赖cookies吗?)这里没有一个域可以放在这里,对吗?这就是为什么我一开始就在做通配符。技术上是正确的。我认为有可能破解它,并根据请求来源动态设置您的allow origin头。类似于
res.header('Access-Control-Allow-Origin',parseRequestForOrigin())。不过,我不确定这会对安全造成什么影响。