bal*_*azs 2 node.js passport.js
我在我的网站中使用了几种Passport身份验证策略,效果很好,但是,我需要一个Demo或(我们可以调用session)策略,它会根据它的会话ID自动授权用户,现在我手动执行,当用户导航时在/demo页面上,我使用会话ID在db(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
});
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
用户架构如下所示:
UserSchema = new Schema({
uname: {type: String},
accounts: [],
docs:[{type:Schema.Types.ObjectId, ref:'Doc'}]
})
Run Code Online (Sandbox Code Playgroud)
它工作,但我需要设置一个会话变量,因为这个方法不会登录用户,我的意思是req.user请求中没有,但是使用该会话变量我可以检查用户是否是演示用户.
if (req.user) {
userid = req.user._id.toString();
} else {
userid = req.session.userId;
}
Run Code Online (Sandbox Code Playgroud)
我确信有一个更优雅的方式,使用现有的护照策略之一.我看到有护照-http,护照匿名和其他几个,但我不确定我应该使用哪个.
对我来说,为用户创建数据库条目很重要.所以稍后我可以附加另一个帐户.
小智 6
事实证明,在这种情况下,创建自定义策略是不必要的.我发现官方的LocalStrategy有一个(未记录的)passReqToCallback选项,它允许您访问reqverify函数中的对象.只有通过更改验证功能,您才可以使用它来使用LocalStrategy执行各种操作:
passport.use(new LocalStrategy({
passReqToCallback: true
}, function(req, username, password, done) {
//now that you have req object, you can
//probably do whatever you need to do right here
});
Run Code Online (Sandbox Code Playgroud)
请注意,该函数现在需要4个参数req, username, password, done,以reqobject 开头,而不是默认值3.
我希望这可以节省你一些时间,我花了一个小时试图解决这个问题,然后再浏览LocalStrategy代码.
| 归档时间: |
|
| 查看次数: |
3665 次 |
| 最近记录: |