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

Posted

技术标签:

【中文标题】将服务器移动到 CORS 位置时,Passport/Express 会话身份验证中断【英文标题】:Passport / Express Session Auth Breaking When Moving Server to a CORS Location 【发布时间】:2015-12-02 04:26:13 【问题描述】:

我正在使用 angular.js 和 ionic 构建一个应用程序。我将所有前端应用程序的东西都移动到一个包中,并将服务器逻辑移动到它自己在数字海洋上的水滴中。现在前端要做CORS。在初始身份验证时,一切似乎都运行良好,除了 express 响应中的 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】:

对于包含 cookie 的请求,您不能为来源设置通配符。

CORS with credentials

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

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

【讨论】:

谢谢!我不知道是这种情况,即使还有其他一些问题也没有提到。因此,如果我的客户来自一个应用程序——(也就是说,每个人都有不同的设备,因此来源不同,我可以不依赖 cookie 吗?)没有一个域我可以在这里正确输入吗?这就是我一开始就使用通配符的原因。 技术上正确。我认为可以破解它并根据请求来源动态设置您的 allow-origin 标头。类似 res.header('Access-Control-Allow-Origin', parseRequestForOrigin() ); 的东西。不过,我不确定安全隐患是什么。

以上是关于将服务器移动到 CORS 位置时,Passport/Express 会话身份验证中断的主要内容,如果未能解决你的问题,请参考以下文章

Node、Express、Oauth2 和 Passport 的 Angularjs CORS 问题

Laravel 7 Passport:被 CORS 策略阻止

Angular/Node/Express/Passport 跨域问题 - 启用 CORS Passport Facebook 身份验证

使用 Passport.js 和 Sails.js 注册后如何重定向到特定位置?

CORS 仅阻止 localhost 请求

如果请求来自 VueJS,NodeJs Passport 执行 CORS 飞行前