Kar*_*Rao 8 authentication node.js express passport-facebook passport.js
在初次成功登录Facebook并使用passport-facebook 1.0.3和express 4.6.1登录重定向回调后,req.session.passport和req.user包含序列化调用期间设置的值(我从stragegy获得),但是在随后访问网站上的不同路由时,req.session.passport和req.user为空,req.isAuthenticated()返回false,因此在从FB初始成功登录后,所有其他路由上的ensureAuthentication方法都会失败.我没有使用群集设置,所以我相信内存存储足以处理这个,快速配置看起来很好(我的意思是顺序),这是我的快速配置
configExpressApp.set('views', './views');
configExpressApp.set('view engine', 'jade');
configExpressApp.use(morgan('dev'));
configExpressApp.use(cookieParser());
configExpressApp.use(bodyParser.urlencoded({
extended: true,
}));
configExpressApp.use(bodyParser.json());
configExpressApp.use(expressSession({
secret:'MyExpressSecret',
saveUninitialized: true,
resave: true
}));
configExpressApp.use(passport.initialize());
configExpressApp.use(passport.session());
configExpressApp.use(methodOverride());
configExpressApp.use(express.static('./public'));
Run Code Online (Sandbox Code Playgroud)
这是初始成功登录和重定向的req.session对象,req.user包含与req.session.passport.user相同的数据.
{ cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
passport:
{ user:
{ _id: 53ce23e3121421f229a438f8,
info: false,
loginType: 'fb',
fbId: 'MyId',
name: 'Karthic Rao',
email: 'kartronics85@yahoo.com'
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我之前与策略内部的done()回调以及序列化调用内部关联的信息.在成功登录和回调之后,我使用res.redirect将用户重定向到不同的路由,但来自该路由的请求包含sessionID(所以我不认为它与会话存储的问题),但是req.user字段不存在(可能是因为passport.initialize()和passport.session()中间件没有找到要进行身份验证的请求)并且req.session.passport字段为空,这里是来自req的console.log的详细信息对象.
sessionID: 'I9R1c3PIYgDW5OpWbNT7qb02Hn4lOeAB',
session:
{ cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
passport: {} },
Run Code Online (Sandbox Code Playgroud)
这是我的反序列化方法
passport.deserializeUser(function(user, done) {
console.log('deserialize loginType facebook');
db.collection("users").findOne({
fbId: user.id
}, function(err, docs) {
console.log(docs);
done(err, docs);
});
});
Run Code Online (Sandbox Code Playgroud)
这是我的序列化方法
passport.serializeUser(function (user, done) {
console.log(user);
done(null, user);
});
Run Code Online (Sandbox Code Playgroud)
这对我的开发造成了很大的障碍,我怎么能解决这个问题呢?
Wal*_*ers 10
好吧,如果你可以在你使用策略的地方添加代码(它应该在中间件中),这将使我们能够完整地查看问题,因为我们需要知道发送到哪个对象serializeUser.
(非常)基本上,当用户尝试进行身份验证时,事情会发生:
req.login在会话中存储有关用户的一些信息serializeUser调用并有效地存储您
在会话中指定的数据.但是从您发布的代码,我怀疑你deserializeUser,user.id是不确定的,因为user存储在会话对象使用一个名为ID字段_id,而不是ID.
如果你改变了
db.collection("users").findOne({
fbId: user.id
Run Code Online (Sandbox Code Playgroud)
至
db.collection("users").findOne({
fbId: user._id
Run Code Online (Sandbox Code Playgroud)
db.collection("users").findById(user._id, [fields],[options],[callback]);
Run Code Online (Sandbox Code Playgroud)
我认为它应该有效.
编辑:我根据@ BrandonZacharie的评论编辑了我的答案,该评论指出我的代码中有错误.
| 归档时间: |
|
| 查看次数: |
7294 次 |
| 最近记录: |