我正在尝试使用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)中提取所有信息。但它变得空洞。我在这里失踪了什么。保存用户基本信息以保持登录状态的最佳方法是什么。
答案 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);
});