У меня есть одноузловой сервер, который отвечает на запросы и перенаправляет пользователя на основе заголовков хоста. Использование заключается в том, что статический/домашний сайт находится на www и каждый пользователь имеет свой собственный поддомен (т.е. www.example.com и site.example.com). Маршрутизация осуществляется в соответствии с site.js.
Когда пользователь не вошел в систему, он перенаправляется на вход.
Я обнаружил, что сессия не сохраняется, когда пользователь перенаправляется на свой поддомен. Я полагаю, что это ожидаемо, но мне интересно, есть ли способ поддерживать одну и ту же сессию в обоих поддоменах.
Я надеялся, что если они вошли в систему и вернулись на www.example.com, они увидят другое представление, включающее ссылку на выход из системы / их приборную панель и т.д. На данный момент я думаю, что мой обходной путь заключается в том, чтобы просто создать сессию на их поддомене, и если они вернутся на www, это будет выглядеть так, как будто они не вошли в систему.
Кто-нибудь сталкивался с этим раньше или знает, как работать с сессиями таким образом?
Я думаю, что проблема может быть в users.js, где я перенаправляю на 'http://site.example.com', поскольку это не относительный путь...
Вот соответствующий код (поиск пользователей осуществляется с помощью MongoDB, и я опустил его, так как он работает нормально - строка, которая вызывает этот сервис - users.authenticate)...
server.js:
app.configure ->
app.set "views", "#{__dirname}/views"
app.set "view engine", "jade"
app.use express.bodyParser()
app.use express.methodOverride()
app.use express.cookieParser()
app.use express.session {
key: "KEY",
secret: "SECRET",
store: new MemoryStore(),
cookie: {
domain: 'example.com',
maxAge : 1000*60*60*24*30*12
}
}
app.use express.static "#{__dirname}/public"
app.use express.logger "short"
app.use express.favicon "#{__dirname}/public/img/favicon.ico"
app.use app.router
site.js:
module.exports = (app) ->
app.get '/', (req, res) ->
console.log "/ hit with #{req.url} from #{req.headers.host}"
domains = req.headers.host.split "."
org = if domains then domains[0] else "www"
if org == "www"
res.render "index", { layout: null }
else
if req.session.user
console.log "session established"
res.render "app", { layout: null }
else
console.log "no session"
res.redirect "http://www.example.com/accounts/login"
users.js:
users = require('../services/users')
module.exports = (app) ->
app.get "/accounts/login", (req, res) ->
res.render "login", { layout: null, locals: { returnUrl: req.query.returnUrl } }
app.post "/accounts", (req, res) ->
users.authenticate app, req.body.login, req.body.password, (user) ->
if user
req.session.user = user
res.redirect "http://#{user.orgName}.example.com"
else
res.render "login", { layout: null, locals: { returnUrl: req.body.url } }
app.get "/accounts/logout", (req, res) ->
console.log "deleting user from session"
delete req.session.user
res.redirect "http://www.example.com
Для тестирования локально на OSX я добавил www.example.com и site.example.com в файл hosts, чтобы поиск DNS обрабатывался локально.