2015-06-23 5 views
1

Есть некоторые проблемы, связанные с доступом к текущему пользователю через мой логин в facebook. Я использую passportJS, Node, express. Я думаю, что мой «пользователь» не входит в систему, но у меня нет возможности проверить. Я загружу то, что у меня есть, и спасибо за то, что кто-то заглядывает в нее - очень ценю это.passportjs + facebook + текущий пользователь

route.js

app.get('/auth/facebook', passport.authenticate('facebook', { scope : ['email', 'public_profile', 'user_friends'] })); 
// handle the callback after facebook has authenticated the user 
app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { 
     successRedirect : '/profile', 
     failureRedirect : '/' 
    })); 
// route for logging out 
app.get('/logout', function(req, res) { 
    req.logout(); 
    res.redirect('/'); 
}); 
}; 
function isLoggedIn(req, res, next) { 
// if user is authenticated in the session, carry on 
if (req.isAuthenticated()) 
    return next(); 
// if they aren't redirect them to the home page 
res.redirect('/'); 
} 

passport.js

passport.use(new FacebookStrategy({ 
    // pull in our app id and secret from our auth.js file 
    clientID  : configAuth.facebookAuth.clientID, 
    clientSecret : configAuth.facebookAuth.clientSecret, 
    callbackURL  : configAuth.facebookAuth.callbackURL, 
    // profileFields: ['id', 'name','picture.type(large)', 'emails', 'username', 'displayName', 'about', 'gender'] 
}, 
// facebook will send back the token and profile 
function(token, refreshToken, profile, done) { 
    // asynchronous 
    process.nextTick(function() { 
     // find the user in the database based on their facebook id 
     User.findOne({ 'facebook.id' : profile.id }, function(err, user) { 
      // if there is an error, stop everything and return that 
      // ie an error connecting to the database 
      if (err) 
       return done(err); 
      // if the user is found, then log them in 
      if (user) { 
       return done(null, user); // user found, return that user 
      } else { 
       // if there is no user found with that facebook id, create them 
       var newUser   = new User(); 
       // set all of the facebook information in our user model 
       newUser.facebook.id = profile.id; // set the users facebook id     
       newUser.facebook.token = token; // we will save the token that facebook provides to the user      
       newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName; // look at the passport user profile to see how names are returned 
       newUser.facebook.email = profile.emails[0].value; // facebook can return multiple emails so we'll take the first 
       console.log(profile); 
       console.log(user); 
       console.log('it is working'); 
       // save our user to the database 
       newUser.save(function(err) { 
        if (err) 
         throw err; 
        // if successful, return the new user 
        return done(null, newUser); 
       }); 
      } 
     }); 
    }); 
})); // end of FacebookStrategy 
}; 

server.js

require('./config/passport')(passport); // pass passport for configuration 

// // required for passport 
app.use(session({ secret: 'ilovescotchscotchyscotchscotch' })); // session secret 
app.use(passport.initialize()); 
app.use(passport.session()); // persistent login sessions 
app.use(flash()); // use connect-flash for flash messages stored in session 

Это мой первый стек переполнение почты, так что извинения в продвинутом, если я оскорбил кого-либо с форматом.

+0

Не могли бы вы уточнить свой вопрос? Если вы когда-либо не уверены, ознакомьтесь с этой ссылкой: http://stackoverflow.com/help/how-to-ask – Paradox

ответ

1

Ваш пользователь должен быть сериализован каким-то образом. Например:

// set up cookie parser and session 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 

app.use(cookieParser()); 
app.use(session({ 
    secret: 'mysecret', 
    resave: true, 
    saveUninitialized: false 
})); 

// passport init 
app.use(passport.initialize()); 
app.use(passport.session()); 

// Lets user information be stored and retrieved from session 
passport.serializeUser(function(user, done) { 
    done(null, user.facebook.id); 
}); 

passport.deserializeUser(function(id, done) { 
User.findById(id, function(err,user){ 
    if(err) done(err); 
     done(null,user); 
    }); 
}); 

Затем вы можете получить доступ к объекту пользователя через req.user. Например, испытательный маршрут может быть:

app.get('/user', function(req, res, next) { 

    res.send(req.user); 
}); 

Удачи вам!

0

Вы также можете сделать это по-другому:

router.get('/auth/facebook', function(req, res, next) { 
    passport.authenticate('facebook', { scope : ['email', 'public_profile', 'user_friends'] } , function(err, user, info) { 
     if(err) return res.status(400).send(err); 
     if(user._id){ 
      req.logIn(user, function(err) { 
       if (err) { return next(err); } 
       //redirect where you want 
       return res.redirect(""); 
      }); 
     } 
    })(req, res, next); 
}) 

req.logIn это функция, которая требуется с пользовательским OBJ для создания сессии и сохранения. В противном случае паспорт никогда не сможет поддерживать сеанс пользователя.

Смежные вопросы