【发布时间】:2014-09-13 07:44:59
【问题描述】:
我正在使用 passport.js + passport-facebook-token 来保护我使用 Strongloop 的 Loopback Framework 构建的 API。
为什么passport反序列化成功后又要对反序列化的用户进行序列化?每个请求都会调用 passport.authenticate 方法!我做错了什么?
这是节点的日志:
deserializeUser, id: XXXXXXXXXXXXXXXX
User found.
serializeUser, id: XXXXXXXXXXXXXXXX
GET /api/events?access_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 304 182ms
这里是js代码:
passport.use(new FacebookTokenStrategy({
clientID: XXXXXXXXXXXXXXXX,
clientSecret: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
},
function(accessToken, refreshToken, profile, done) {
//check user table for anyone with a facebook ID of profile.id
User.findOne({
'facebookId': profile.id
}, function(err, user) {
if (err) {
return done(err);
}
if (user) {
console.log("User found.");
return done(err, user);
} else {
console.log("User not found.");
User.create({
email: profile.emails[0].value,
facebookId: profile.id,
password: 'secret'
}, function(err, user) {
console.log(user.id);
console.log(user.email);
console.log(user.facebookId);
console.log("User created");
return done(err, user);
});
}
});
}));
passport.serializeUser(function(user, done) {
console.log('serializeUser, id: ' + user.facebookId);
done(null, user.facebookId);
});
passport.deserializeUser(function(id, done) {
console.log('deserializeUser, id: ' + id);
User.findOne({
'facebookId': id
}, function(err, user) {
if (!err) {
done(null, user);
} else {
done(err, user);
}
});
});
【问题讨论】:
-
能否展示定义中间件处理身份验证的代码?它应该类似于
passport.authenticate("facebook", function ....)。如果您执行app.get("/*", passport.authenticate())之类的操作,它会按预期工作。 -
这是为此添加的唯一 loc:app.use(passport.authenticate('facebook-token'));
-
嗯,好的,我明白了。但我的理解是它应该作为中间件添加,因为它可以保护我的 api 免受未经授权的访问......在哪里添加这条线的正确位置?或者你有什么建议?
标签: javascript node.js passport.js passport-facebook