Используя Express и Node, как поддерживать сессию через субдомены/хост-хедеры

У меня есть одноузловой сервер, который отвечает на запросы и перенаправляет пользователя на основе заголовков хоста. Использование заключается в том, что статический/домашний сайт находится на 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 обрабатывался локально.

12
задан mattgi 31 January 2012 в 22:36
поделиться