我有一个应用程序,我试图让用户创建自己的子域名。 为了在开发和测试时让它在本地工作,我必须在我的主机文件中设置一些可用的子域。
登录时,我正在使用oauth,谷歌是我正在使用的第一个提供商。
当用户从mydomain.com
谷歌登录时强制重定向身份验证到localhost
。我编写了一些中间件来检查req.get('host')
是localhost
,还是重定向到mydomain.com
。
这似乎工作正常,但是当重定向转到localhost
时,似乎express与mydomain.com
返回的会话不匹配。
由于这仅适用于开发和测试,是否有办法允许快递跨域共享所有会话信息,或添加白名单?
我在SO上找到的东西指出我将重定向中间件作为
module.exports = function(baseUrl){
var base = baseUrl.split(':');
base = base[1].replace('//','');
return function(req, res, next) {
console.log('in redirect');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', base);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
if(req.hostname.indexOf('localhost') > -1) {
var redirect = req.get('host').replace('localhost', base);
console.log('redirect is', redirect, req.path);
return res.redirect(redirect + '/');
}
next();
}
}
但是在我的帖子登录路线中,我需要检查请求的URL是否是localhost,如果是,那么我需要替换它。出于某种原因,中间件未在此路由中被调用。它在我最初
时被调用 function createUrl(req, subdomain){
var domain = req.get('host') === 'localhost:3000' ? 'mydomain.com:3000' : req.get('host');
var url = req.protocol + '://' + subdomain + '.' + domain;
return url + '/team'
}
function redirectToSubdomain(req, res){
var url = createUrl(req, "me");
console.log('new url is ', url);
res.redirect(url)
}
router.get('/', auth.isAuthenticated(), function(req, res) {
var team = Team.getSubdomain(req);
if(team.error) return redirectToSubdomain(req, res);
return res.render('team', req.data);
});
我已尝试将我的Cookie设置为接受所有域
app.use(passport.session({cookie: { secure: true, domain: '*'}}));
答案 0 :(得分:1)
我最终没有使用dev.localhost
作为开发网站的主要网址,而不是subdomain.dev.localhost
用于子域名,以及我的Cookie集domain: '.dev.localhost'
。做了一个享受。