2012-11-29 15 views
7

Attualmente ho due app nodo separate in esecuzione su due porte diverse ma condividono lo stesso archivio dati di backend. Devo condividere le sessioni degli utenti tra le due app in modo che quando un utente accede a una app, la sua sessione sia disponibile e sembra che si colleghi all'altra app. In questo caso, è un sito Web pubblico e un backend amministrativo.Sessioni condivise tra app di nodo?

La nostra impostazione è la seguente:

  • nodo con espressa
  • passaporto viene utilizzato per gestire autenticazione con la strategia locale
  • stiamo usando connect-Redis per permetterci di condividere le sessioni tramite Redis .
  • nostri domini simile a questa: www.mydomain.com e adm.mydomain.com

La configurazione per per le cose di sessione (e Redis) è lo stesso per entrambe le applicazioni:

session: { 
    options: { 
     secret: "my secret", 
     cookie: { 
      domain: "mydomain.com", 
      maxAge:1000*60*60*24 
     } 
    }, 
    redis: { 
     host: 'my host', 
     maxAge: 86400000, 
     secret: "my secret" 
    } 
} 

la configurazione per roba sessione app.js assomiglia a questo:

if (app.settings.env === "production") { 
    session.options.store = new RedisStore(session.redis); 
} 
app.use(express.session(session.options)); 
app.use(passport.initialize()); 
app.use(passport.session({ secret: 'a different secret' })); 

Cosa mi aspetto che faccia: ci permettono di vedere lo stesso Sess ID ion nel cookie tra le due app.

Quindi la mia domanda è: Come configurare express, redis e passport in modo che sia possibile condividere sessioni tra diversi sottodomini?

+2

Penso che potrebbe essere necessario per specificare il dominio dei cookie come '" .mydomain.com "' - nota l'iniziale '.'. –

+0

senza un "*"? Abbiamo utilizzato "* .mydomain.com" ieri in un test e non sembra funzionare. Stamattina darò una prova e vedere quale sia il risultato. – jpittman

+1

Hai inserito un '*', giusto? In tal caso, sì, solo il punto principale. Penso che sia ciò che rende un cookie leggibile da diversi sottodomini. Fammi sapere e potrei fornirlo come risposta. –

risposta

4

Forse un po 'obsoleto, ma in questo momento Express-session può riconoscere l'opzione dominio per cookie. Secondo fonte:

function session(options){ 
    var options = options || {} 
    // name - previously "options.key" 
    , name = options.name || options.key || 'connect.sid' 
    , store = options.store || new MemoryStore 
    , cookie = options.cookie || {} 
     ... 

E questo è per l'impostazione dei cookie:

var Cookie = module.exports = function Cookie(options) { 
    this.path = '/'; 
    this.maxAge = null; 
    this.httpOnly = true; 
    if (options) merge(this, options); 
    ... 

Quindi, qualcosa di simile a questo lavoro per corrente 1.10.1 maestro:

secret: "my secret", 
    cookie: { 
     domain: "mydomain.com", 
+0

Grazie per l'avviso. Non sono più sul progetto e non sto lavorando su Node, ma questa è un'ottima notizia. – jpittman

2

Express-session non sembra riconoscere l'opzione "dominio" per i cookie, quindi il problema. Il cookie che memorizza l'ID di sessione viene automaticamente associato al dominio per ogni app e quindi non può essere condiviso.

Un'opzione è scrivere il proprio modulo single-sign-on per condividere sessioni su webapps. Probabilmente vivrebbe in una dichiarazione app.use() abbastanza presto nell'ordine di esecuzione e creerebbe semplicemente un cookie separato (che sarebbe cross-domain), creerà un id di sessione SSO separato e memorizzerà l'id SSO in questo nuovo cookie . Successivamente, è sufficiente eseguire il cross-popolamento di req.session e req.sso-session in base alle esigenze.

Problemi correlati