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

时间:2019-03-21 11:41:58

标签: node.js passport.js passport-local

我是node的新手。最近,我决定创建一个博客系统,它具有一个由护照模块和本地策略创建的授权系统。 我使用护照文档和一些视频教程来设计它,但是我不明白它是如何工作的,我也不了解逻辑。 我有一个具有两个字段(用户名,密码)和提交按钮的登录表单。 您可以在此处查看我的login.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);
}

现在我不明白本地策略如何运作。如何理解我的登录表单中的哪个字段用于用户名和哪个字段用于密码?它仅接受两个参数(用户名,密码),但我不知道它如何指定这些参数来自何处,以及如何理解它们必须是我的登录表单凭据。 如果有人向我解释这里发生了什么,我将非常感谢。

2 个答案:

答案 0 :(得分:0)

在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

答案 1 :(得分:0)

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

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

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

This是一种设计良好的健壮哈希算法。还有其他人。