我是节点中的新人。最近我决定创建一个博客系统,它有一个由护照模块和本地策略创建的授权系统。我使用护照文档和一些视频教程来设计它,但我无法理解它是如何工作的,我不明白逻辑。我有一个登录表单,其中包含两个字段(用户名,密码)和一个提交按钮。你可以在这里看到我的login.jade代码。它是用jade模板语言编写的,并使用了语义UI(类似bootstrap)。
form.ui.form(method="POST",action="")
div.field
label Username
div.ui.left.icon.input
i.user.icon
input(type="text",name="username",placeholder="username")
div.field
label Password
div.ui.left.icon.input
i.lock.icon
input(type="password",name="password",placeholder="password")
button.ui.primary.button(type="submit") log-in
这是我的护照本地策略
passport.use(new localStrategy(function(username,password,done){
User.checkUserName(username,function(err,user){
if (err) throw err;
if (!user) {
console.log('unknown user');
return done(null,false,{message:'user not found'});
}
if(user.password!=password){
return done(null,false , {message : 'password is wrong'});
}
return done (null,user);
});
}));
checkUserName是我的模型(user.js)中的一个函数,它在数据库中查找用户名。
module.exports.checkUserName= function(username,callback){
User.findOne({username:username},callback);
}
现在我不明白localstrategy是如何运作的。它如何理解我的登录表单中的哪个字段用于用户名以及哪个字段用于密码?它只接受两个参数(用户名,密码),但我不知道它如何指定这些参数的来源以及它如何理解这些必须是我的登录表单凭据。如果有人向我解释这里发生了什么,我将非常感激。
如果您正在使用用户名/密码身份验证,则默认情况下localStrategy()使用带有name="username"
和name="password"
的输入字段。所以,你的表格是正确的。
如果要使用其他字段名称,可以更改默认值。读这个。 http://www.passportjs.org/docs/username-password/#parameters
我想指出你应该为你的密码使用散列方案,而不是在数据库中以纯文本形式存储它们。因为,Ashley Madison。
This是一个精心设计的强大散列方案。还有其他人。
查看github中的implementation of the strategy,它会查看请求及其正文的查询,默认情况下会查找username
和password
键以获取各自的值。
这与登录表单中的名称值匹配。
如果要为输入使用不同的名称值,可以通过提供usernameField或passwordField值来指定要使用的值,如下所示
passport.use(new localStrategy(function(username,password,done){
User.checkUserName(username,function(err,user){
if (err) throw err;
if (!user) {
console.log('unknown user');
return done(null,false,{message:'user not found'});
}
if(user.password!=password){
return done(null,false , {message : 'password is wrong'});
}
return done (null,user);
});
},
{
usernameField: 'user',
passwordField: 'pass'
}
));
然后,您可以更新登录表单名称值以匹配
form.ui.form(method="POST",action="")
div.field
label Username
div.ui.left.icon.input
i.user.icon
input(type="text",name="user",placeholder="username")
div.field
label Password
div.ui.left.icon.input
i.lock.icon
input(type="password",name="pass",placeholder="password")
button.ui.primary.button(type="submit") log-in