2013-09-27 6 views
8

Sto utilizzando il passaporto JS, express e mangusta per creare un'API. Quando lo provo nello stesso dominio, mantiene la sessione e funziona correttamente. Ma in cross domain fallisce. Qualsiasi idea su come posso mantenere la sessione in cross domain usando la stessa configurazione. Di seguito è riportato il codiceIl passaporto js non riesce a mantenere la sessione nel dominio incrociato

allowCrossDomain = function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); 
    res.header("Access-Control-Allow-Headers", req.headers["access-control-request-headers"]); 
    // res.header("Access-Control-Allow-Credentials", "true"); 
    if ("OPTIONS" == req.method) { 
     res.send(200); 
    } else { 
     next(); 
    } 

    //allow all crossDomain request 
app.use(allowCrossDomain); 

//session handling 
app.use(express.cookieParser("gallery")); 
app.use(express.session()); 
app.use(passport.initialize()); 
app.use(passport.session()); 

app.use(function(req, res, next) { 
    // check if client sent cookie 
    var cookie = req.cookies.cokkieName; 
    if (cookie === undefined) { 
     //set up cookie here by a random number 
     }); 
    } 
    next(); // <-- important! 
}); 
passport.use(new LocalStrategy({ 
    usernameField: "email" 
}, 
function(email, password, done) { 
    User.authenticate(email, password, function(err, reply) { 
     //authenticate user and call the callback 
      return done(err, false); 

    }); 
})); 


passport.serializeUser(function(user, done) { 
return done(null, user._id); 
}); 


passport.deserializeUser(function(id, done) { 
//find user via id and return the user details 
return done(null, user._id); 
}); 

    app.post("/login", function(req, res, next) { 
    passport.authenticate("local", 
     function(err, data, info) { 
      //custom callback 
      user.getProfile(req, res, next, err, data, info); 
     })(req, res, next); 
}); 
+0

@ kundu_ hai trovato la soluzione? –

risposta

2

Lasciare le carte in regola per essere condivisi impostando Access-Credenziali Control-allow- intestazione. (Io non sono sicuro perché avete commentato nel codice)

res.header("Access-Control-Allow-Credentials", "true"); 

poi pass the credentials da JavaScript tramite oggetto XHR.

xhr.withCredentials = true; 
6

Avevo lo stesso problema. Prima di configurare nulla in App espresso, utilizzare la seguente (esattamente lo stesso) per impostare intestazione della risposta per il cross-domain:

app.use(function(req, res, next) { 
res.header('Access-Control-Allow-Credentials', true); 
res.header('Access-Control-Allow-Origin', req.headers.origin); 
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); 
if ('OPTIONS' == req.method) { 
    res.send(200); 
} else { 
    next(); 
} 
}); 

Funziona per me. Buona fortuna!

+0

Sai perché deve essere così? Perché sono richieste le credenziali? –

+0

Sei fantastico. Ho sprecato 6 ore per questo. Grazie uomo –

+0

Anche io sto affrontando lo stesso problema e questa soluzione non funziona ancora per me. Cosa dovrei fare? Per favore aiuto. –

4

Come per la risposta di Sriharsha:

  • Set res.header("Access-Control-Allow-Credentials", "true");

  • assicurarsi di passare le credenziali nella chiamata lato client. Ad esempio, per AJAX, aggiungere questo alla tua chiamata: xhrFields: {withCredentials: true},

Inoltre:

  • Non utilizzare il carattere jolly per Access-Control-Allow-Origin con una richiesta di credenziali

    Come explained on MDN:

    quando risponde a una richiesta di credenziali, server deve specificare un dominio , e non può usare selvaggio cardatura


Io uso questo file, e lo chiamano dal mio modulo principale con require("./enable-cors.js")(app);

// enable-cors.js 
module.exports = function(app) { 

    var methodOverride = require('method-override') 
    app.use(methodOverride()); 
    var allowCrossDomain = function(req, res, next) { 
     res.header('Access-Control-Allow-Credentials', true); 
     res.header('Access-Control-Allow-Origin', req.headers.origin); 
     res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
     res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); 

     // intercept OPTIONS method 
     if ('OPTIONS' == req.method) { 
      res.send(200); 
     } 
     else { 
      next(); 
     } 
    }; 
    app.use(allowCrossDomain); 
    // Built upon: http://cuppster.com/2012/04/10/cors-middleware-for-node-js-and-express/#sthash.WdJmNaRA.dpuf 

}; 
+0

Grazie mille. –