【发布时间】:2015-01-07 06:49:33
【问题描述】:
我在我的网站中使用了几种 Passport 身份验证策略,效果很好,但是,我需要一个 Demo 或(我们可以调用 session )通过会话 ID 自动授权用户的策略,现在我'我手动执行此操作,当用户导航到 /demo 页面时,我使用会话 ID 在数据库(mongodb)上运行查询,如果用户存在,我会使用该用户呈现页面,如果不是我创建一个。
app.get('/demo', function(req,res) {
db.User.findOne({ 'accounts.kind': 'demo', 'accounts.sid': req.sessionID }, function(err, user) {
if (user) {
res.render( 'home', {
user: user
});
} else {
var user = new db.User();
user.accounts.push({
kind: 'demo',
sid: req.sessionID,
created: Date.now
});
req.session.userId = user._id;
user.save(function(err) {
if(err) { throw err; }
res.render( 'home', {
user: user
});
});
}
});
});
用户架构如下所示:
UserSchema = new Schema({
uname: {type: String},
accounts: [],
docs:[{type:Schema.Types.ObjectId, ref:'Doc'}]
})
它可以工作,但我需要设置一个会话变量,因为这个方法没有登录用户,我的意思是请求中没有req.user,但是使用那个会话变量我可以检查用户是否是演示用户。
if (req.user) {
userid = req.user._id.toString();
} else {
userid = req.session.userId;
}
我确信有一种更优雅的方法可以使用现有的护照策略之一。我看到有passport-http、passport-anonymous 和其他几个,但我不确定应该使用哪个。
为用户创建一个数据库条目对我来说很重要。所以稍后我可以附加另一个帐户。
【问题讨论】:
-
这不适用于 cookie 吗?
-
@Patrick 是的,它涉及cookie,会话id在cookie中,
-
那你就不需要策略了。序列化和反序列化应该自动工作并在用户回来时检索会话。
标签: node.js passport.js