从Passport策略传递路线中的用户信息

时间:2015-06-12 06:20:58

标签: node.js facebook express passport.js

我正在尝试使用express。使用passportjs验证用户。

Passport.js看起来像这样。



var USER_INFO = {};
var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback';
module.exports = function(passport) {
	passport.use(new FacebookStrategy({
		clientID: FB_CLIENT_ID,
		clientSecret: FB_CLIENT_SECRET,
		callbackURL: FB_CALLBACK
	}, 
	function(accessToken, refreshToken, profile, done) {
		process.nextTick(function() {
			USER_INFO.id = profile.id;
		});
	}));
}




var express = require('express'); // call express
var app = express(); // define our app using express
var router = express.Router(); // get an instance of the express Route
var passport = require('passport');
USER_INFO = {};
require('./config/passport')(passport);
app.get('/auth/facebook', passport.authenticate('facebook'));

app.get('/auth/facebook/callback', passport.authenticate('facebook', {
    successRedirect : '/fb',
    failureRedirect : '/error'
}));

app.get('/fb', function (req, res) {
    res.json(USER_INFO);
}); 

我想要在res.json(user_info)中提取所有信息。但它变得空洞。我在这里失踪了什么。保存用户基本信息以保持登录状态的最佳方法是什么。

2 个答案:

答案 0 :(得分:4)

首先,您应该USER_INFO = {}存储在当前请求的范围之外。如果两个单独的用户发出请求,那么他们将获得相同的对象。

您至少应该以可以检索单独

的方式存储它们
var USERS = {};
...
module.exports...
passport.use...
...

function(accessToken, refreshToken, profile, done) {
    USERS[profile.id] = profile;
    done(null, profile);
}));

现在,如果两个单独的用户发出请求,他们的信息会单独存储在USERS

{
    1234: {id: 1234, name: FOO},
    6789: {id: 6789, name: BAR},
}

done(null, profile)serialize该用户。如果你还没有定义serialize/deserialize functions,你应该这样做:

passport.serializeUser(function (user, done) {
    done(null, user.id);
});
passport.deserializeUser(function (id, done) {
    var user = USERS[id];
    done(null, user);
});

现在,您的用户将在req.user

各自的请求上下文中使用

所以你只需要这样做:

app.get('/fb', function (req, res) {
    res.json(req.user);
}); 

答案 1 :(得分:3)

您忘记在process.nextTick()中调用 done()

var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback';
module.exports = function(passport) {
    passport.use(new FacebookStrategy({
        clientID: FB_CLIENT_ID,
        clientSecret: FB_CLIENT_SECRET,
        callbackURL: FB_CALLBACK
    }, 
    function(accessToken, refreshToken, profile, done) {
        process.nextTick(function() {
            var USER_INFO = {};
            USER_INFO.id = profile.id;
            done(USER_INFO)
        });
    }));
}

您可以将任何对象传递给 done(),稍后您的路线中会变为 req.user 。在您的情况下,您要回复的 USER_INFO req.user

app.get('/fb', function (req, res) {
    res.json(req.user);
});