2017-09-21 1 views
0

J'ai trouvé le post suivant sur la façon dont deserializeUser est censé fonctionner: PassportJS serializeUser and deserializeUser execution flowComment appeler deserializeUser avec passeport

Cependant, lorsque je tente et envoyer un JSON au serveur qui contient la clé pour l'utilisateur, je ne peux pas appeler req .user pour trouver les détails de l'utilisateur.

Je ne sais pas comment vérifier ce qui se passe parce qu'il se passe beaucoup de choses sous le capot.

Est-ce que le passeport s'attend à ce que j'envoie un cookie à exprimer contenant la clé? Un nom spécifique pour le cookie ou le format? Faut-il que j'ai envoyé la clé au format JSON?

const express = require('express') 
const app = express() 
const mongoose = require('mongoose') 
var cors = require('cors') 
const bodyParser = require('body-parser') 
var http = require('http') 
var cookieParser = require('cookie-parser'); 
app.use(cookieParser('someSecret')); 
var session = require('express-session'); 
app.use(session()); 
var flash=require("connect-flash"); 
app.use(flash()); 

passport.use(new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password', 
    session: true, 
    passReqToCallback: true 
}, 
function(req, username, password, done){ 
    registrationModel.findOne({username: username}, function(err, user){ 
    if (err) { return done(err); } 
    if (!user){ 
     console.log("Username incorrect") 
     return done(null, false, { message: 'Incorrect username.'}); 
    } 
    if (user.password != password){ 
     console.log("Password Incorrect") 
     return done(null, false, { message: 'Incorrect Password.'}); 
    } else { 
     console.log("Returning good stuff") 
     console.log(user) 
     return done(null, user); 
    } 
    }); 
    } 
)); 

//Needed for authenticating the session and initializing passport 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function(user, done) { 
    console.log("Serializing User") 
    console.log(user.id) 
    console.log("Should be serialized") 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done){ 
    users.User.findById(id, function(err, User) { 
    console.log('attempting to deserialize user') 
    console.log(user) 
    console.log('--------------') 
    if (User){ 
     done(err, User); 
    } else { 
     done(err, null); 
    } 
}) 
}) 

app.post('/api/authenticate', passport.authenticate('local'), 
function(req, res){ 
    const individualIWant = jsonQuery('req.sessionStore.sessions') 
    res.cookie('FreeUp', req.session.passport.user) 
    var cookie = JSON.stringify(req.session.passport.user) 
    res.send({'name': 'FreeUp', 'value': cookie}) 
}) 

Je peux voir un cookie dans le navigateur: nom: « FreeUp » valeur: « » 59c4cf4ecb364a000f23a707 « »

La valeur est l'ID de base de données pour l'objet et non la clé de la sérialisé objet. Je comprends que j'ai besoin d'accéder à la clé de l'objet sérialisé en utilisant res.req.sessionID et de renvoyer cela à la place.

Cependant, le point reste, je ne sais pas s'il faut le renvoyer en tant que fichier json ou un cookie. Cela semble être une bibliothèque si complexe à utiliser.

Quel est le format que le passeport m'attend à utiliser lors de l'envoi des données depuis Ember?

Merci!

+0

Pouvez-vous montrer comment vous avez configuré votre application? Les réponses à vos questions en dépendent grandement. – Paul

Répondre

0

J'ai eu beaucoup de problèmes avec cela aussi. D'après ce que je comprends, Passport ne crée pas réellement une session elle-même. Vous devez donc utiliser un autre élément de middleware, comme express-session, et vous aurez également besoin d'un analyseur de cookie.

J'ai construit mon authentification en utilisant le tutoriel qu'ils ont à Scotch: https://scotch.io/tutorials/easy-node-authentication-setup-and-local. C'est vraiment bien commenté et le seul tutoriel simple que j'ai pu trouver (en particulier pour l'authentification locale). Je peux vérifier que cela a fonctionné pour moi et req.user stocke toutes les informations d'identification quand je le passe dans mes itinéraires.

Espérons que ça aide.