2017-08-17 3 views
1

J'ai deux serveurs Node.js locaux:sessions sur deux serveurs locaux Node.js

  1. http://localhost:3000

  2. http://localhost:3001

-je utiliser express.js et passport.js pour l'authentification. L'authentification fonctionne correctement, si:

  1. je me connecte sur le serveur 1
  2. je me connecte sur le serveur 2

puis la session sur le serveur 1 disparait. Comment cela pourrait-il être évité?

app.use(bodyParser()); 
app.use(cookieParser()); 
app.use(session({ 
secret: '12345', 
resave: true, 
saveUninitialized: true 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 


passport.use(new LocalStrategy(
function(username, password, done) { 
    users.getActiveByUsername(username, function(err, user) { 
    if (err) {console.log(err); return done(err); } 
    if (!user) { 
     return done(null, false, { message: 'Incorrect username' }); 
    } 
    if (user.password != password) { 
     return done(null, false, { message: 'Incorrect password' }); 
    } 
    return done(null, user); 
    }); 
} 
)); 

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

passport.deserializeUser(function(user, done) { 
done(null, user); 
}); 

app.post("/login", jsonParser, function(req, res, next) { 
passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { res.status(400).send('Wrong username or password');return; } 
    req.logIn(user, function(err) { 
    if (err) { return next(err); } 
    return res.json({'success':'Successful login'}); 
    }); 
})(req, res, next); 
}); 
+0

S'il vous plaît fournir du code, en particulier lorsque vous gérez la session. –

+1

Je crois que vous devez stocker le cookie de session dans un stockage externe comme Redis et vérifier la validité de la session de l'utilisateur dans chacun des serveurs Node.js. – Artem

+0

@KayvanMazaheri a ajouté le code – Maxim

Répondre

1

Je suppose que vous utilisez la même base de données pour vos deux applications.

Vous ne pouvez pas enregistrer des sessions de différentes applications du même nom d'hôte sur la même base de données par défaut. Vous devez les distinguer en utilisant différents noms ou préfixes.

Si vous utilisez express-session pour la gestion de vos sessions, vous pouvez définir des noms différents via les options:

app.use(session({ 
    secret: '12345', 
    resave: true, 
    saveUninitialized: true, 
    name: 'app1'   // use a different name for the second app 
})); 

Lire la official documentation de express-session pour plus d'informations.

Remarque
si vous avez plusieurs applications en cours d'exécution sur le même nom d'hôte (ce qui est juste le nom, soit localhost ou 127.0.0.1, différents schémas et les ports ne nomment pas un nom d'hôte différent), alors vous devez séparer les cookies de session les uns des autres. La méthode la plus simple consiste à définir simplement names par application.

+0

Merci pour la réponse – Maxim