javascript - passportjs +facebook + 当前用户

标签 javascript node.js facebook session passport-facebook

在弄清楚如何通过我的 Facebook 登录访问当前用户时遇到一些问题。我正在使用 passportJS、Node、express。我认为我的“用户”没有保持登录状态,但我无法检查。我会上传我所拥有的,并感谢您查看它的任何人 - 真的很感激。

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

这是我的第一篇 stackoverflow 帖子,如果我用这种格式侮辱了任何人,请提前致歉。

最佳答案

您的用户应该以某种方式序列化。例如:

// 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);
});

祝你好运!

关于javascript - passportjs +facebook + 当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31011772/

相关文章:

javascript - onkeydown后如何获取输入的值?

javascript - 在 Javascript 中使用函数分配进行原型(prototype)设计

javascript - 在 MongoDB 中使用 $lt 和 $gt 过滤日期值

javascript - 使用 Browserify 在 Node JS 项目中包含 JQuery Mobile

ios - 调用 FBSDKGameRequestContent : receiving the invite but not the notification in Facebook

javascript - Angular 路线解决不等待 promise

javascript - 无响应的按钮

node.js - 如何在环回 4 上实现自引用模型而不获得循环依赖

facebook - 通过 Facebook Graph API 查询测试用户

node.js - 为什么我无法将其发布到我用户的 Facebook 墙上?