理解护照本地策略功能nodejs的问题

problem with understanding passport local strategy functionality nodejs

我是 node.js 的新手。最近我决定创建一个博客系统,它有一个由护照模块和本地策略创建的授权系统。 我使用护照文件和一些视频教程来设计它,但我不明白它是如何工作的,我不明白其中的逻辑。 我有一个登录表单,它有两个字段(用户名、密码)和一个提交按钮。 你可以在这里看到我的 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 是如何工作的。它如何理解我的登录表单中的哪个字段是用户名,哪个字段是密码?它只接受两个参数(用户名、密码),但我不知道它如何指定这些参数的来源以及它如何理解这些必须是我的登录表单凭据。 如果有人向我解释这里发生了什么,我将不胜感激。

查看 github 中的 implementation of the strategy 它会查看请求及其正文的查询,默认情况下会查找 usernamepassword 键各自的价值。

这与登录表单中的名称值匹配。

如果您想为您的输入使用不同的名称值,您可以通过提供如下所示的 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

如果您使用用户名/密码身份验证,默认情况下 localStrategy() 使用带有 name="username"name="password" 的输入字段。所以,你的表格是正确的。

如果您想使用其他字段名称,您可以更改默认值。读这个。 http://www.passportjs.org/docs/username-password/#parameters

我想指出,您应该对密码使用散列方案,而不是将它们以纯文本形式存储在数据库中。因为,Ashley Madison.

This 是一个精心设计的健壮哈希方案。还有其他的。