Ho un singolo server nodo che risponde alle richieste e reindirizza un utente in base alle intestazioni host. L'uso è che il sito statico/home vive su www e ogni utente ha il proprio sottodominio (ad esempio www.example.com e site.example.com). Il routing è come per site.js.Utilizzo di Express e Node, come mantenere una sessione tra sottodomini/hosthead
Quando l'utente non ha effettuato l'accesso, viene reindirizzato per accedere.
Sto scoprendo che la sessione non viene mantenuta quando l'utente viene reindirizzato al proprio sottodominio. Immagino che questo è previsto, ma mi chiedo se c'è un modo per mantenere la stessa sessione su entrambi i sottodomini.
Speravo che se avessero effettuato il login e fossero tornati su www.example.com avrebbero visto una vista diversa che includeva un link per il logout/il loro cruscotto, ecc. La mia soluzione al momento, sto pensando, è solo creare la sessione sul loro sottodominio e se ritornano a www sarà come se non fossero loggati.
Chi ha avuto a che fare prima o ha risposte su come gestire le sessioni in questo modo?
Credo che il problema può essere in users.js dove reindirizzare a 'http://site.example.com' come il suo non è un percorso relativo ...
Ecco il relativo codice (l'utente ricerca viene fatto usando MongoDB e ho lasciato fuori come il suo bel lavoro - la linea che chiama questo servizio è 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
verificarlo a livello locale su OSX, ho aggiunto www.example.com e site.example.com al mio file hosts in modo che le ricerche DNS vengono gestite localmente.
utente '$ .ajaxSetup' per aggiungere' withCredentials: true' a ogni richiesta – Xerri
@Maksims "Utilizzo del dominio non funzionerà bene su localhost" - perché non funziona su localhost? Ho: api.localhost: 3000 e localhost: 3000 - non funziona? : \ – AmpT
Perché per sicurezza del browser, il cookie non verrà inviato se il dominio corrente non corrisponde al dominio definito. Per gli ambienti di sviluppo e stage è sufficiente commentare la proprietà del dominio o impostarla su "localhost". – moka