Tengo un servidor de nodo único que responde a las solicitudes y redirige a un usuario en función de los encabezados de host. El uso es que el sitio estático/home vive en www y cada usuario tiene su propio subdominio (es decir, www.example.com y site.example.com). El enrutamiento es según site.js.Uso de Express and Node, cómo mantener una sesión en subdominios/hostheaders
Cuando el usuario no ha iniciado sesión, se le redirige para iniciar sesión.
Estoy descubriendo que la sesión no se mantiene cuando el usuario es redirigido a su subdominio. Supongo que esto se espera, pero me pregunto si hay una forma de mantener la misma sesión en ambos subdominios.
Tenía la esperanza de que si estuvieran conectados y volvieran a www.example.com verían una vista diferente que incluyera un enlace para cerrar la sesión/su tablero, etc. Mi solución en este momento, estoy pensando, es simplemente crear la sesión en su subdominio y si vuelven a www será como si no hubieran iniciado sesión.
¿Alguien ha tratado esto antes o tiene respuestas sobre cómo manejar sesiones de esta manera?
creo que el problema puede estar en users.js donde vuelvo a dirigir a 'http://site.example.com' ya que no es una ruta relativa ...
Este es el código correspondiente (el usuario operaciones de búsqueda se realiza utilizando MongoDB y lo he dejado como su funcionamiento muy bien - la línea que llama a este servicio es 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
comprobarlo localmente en OSX, me han añadido www.example.com y site.example.com a mi archivo de hosts para que las búsquedas de DNS consiguen manejados localmente.
user '$ .ajaxSetup' para agregar' withCredentials: true' a cada solicitud – Xerri
@Maksims "Usar el dominio no funcionará bien en localhost" - ¿por qué no funciona en localhost? Tengo: api.localhost: 3000 y localhost: 3000 - ¿no funciona? : \ – AmpT
Debido a la seguridad del navegador, no se enviará la cookie si el dominio actual no coincide con su dominio definido. Para entornos de desarrollo y escenario, puede comentar propiedades de dominio o establecerlas en "localhost". – moka