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

gho*_*... 5 facebook node.js 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;
		});
	}));
}
Run Code Online (Sandbox Code Playgroud)

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);
}); 
Run Code Online (Sandbox Code Playgroud)

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

lag*_*lex 5

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

你至少应该把它们存储在你可以检索它们的方式分别

var USERS = {};
...
module.exports...
passport.use...
...

function(accessToken, refreshToken, profile, done) {
    USERS[profile.id] = profile;
    done(null, profile);
}));
Run Code Online (Sandbox Code Playgroud)

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

{
    1234: {id: 1234, name: FOO},
    6789: {id: 6789, name: BAR},
}
Run Code Online (Sandbox Code Playgroud)

done(null, profile)serialize用户。如果尚未定义序列化/反序列化函数,则应这样进行:

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

现在,您的用户将在他们各自的请求上下文中可用 req.user

因此,您只需要执行以下操作:

app.get('/fb', function (req, res) {
    res.json(req.user);
}); 
Run Code Online (Sandbox Code Playgroud)