2013-09-27 8 views
8

Używam paszportu JS, ekspresowego i mangusta do tworzenia interfejsu API. Kiedy testuję go w tej samej domenie, utrzymuje sesję i działa dobrze. Ale w domenie krzyżowej nie działa. Jakąkolwiek koncepcję utrzymania sesji w domenie krzyżowej przy użyciu tej samej konfiguracji. Poniżej znajduje się kodPassport js nie utrzymuje sesji w domenie interdyscyplinarnej

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_ dostałeś rozwiązanie? –

Odpowiedz

2

Pozwól poświadczenia mają być dzielone przez ustawienie Access-Control-Allow-poświadczenia nagłówek. (Nie jestem pewien, dlaczego pisali w kodzie)

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

następnie pass the credentials z javascript przez obiekt użyciem nagłówków XHR.

xhr.withCredentials = true; 
6

Miałem ten sam problem. Przed przystąpieniem do konfigurowania czegokolwiek w wyraźnej aplikacji, należy użyć następujących (dokładnie to samo), aby ustawić nagłówek odpowiedzi na 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(); 
} 
}); 

to działa na mnie. Powodzenia!

+0

Czy wiesz, dlaczego tak musi być? Dlaczego wymagane są poświadczenia? –

+0

Jesteś świetny. Z tego powodu zmarnowałem 6 godzin. Dzięki człowieku –

+0

Mam również ten sam problem i to rozwiązanie nadal nie działa dla mnie. Co powinienem zrobić? Proszę pomóż. –

4

Jak na odpowiedź Sriharsha za:

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

  • Upewnij się, że przechodzą poświadczeń w wezwaniu po stronie klienta. Na przykład dla technologii AJAX, dodać do swojej rozmowy: xhrFields: {withCredentials: true},

Dodatkowo:

  • Nie używaj wieloznaczny dla Access-Control-Allow-Origin z akredytowanych zamówienie

    Jak explained on MDN:

    odpowiadając do akredytowanych żądanie, serwer musi określić domenę, a nie można używać dziki carding


Używam tego pliku, i nazywają to z mojego głównego modułu z 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

Dziękuję bardzo. –

Powiązane problemy