【问题标题】:problem with understanding passport local strategy functionality nodejs理解护照本地策略功能nodejs的问题
【发布时间】:2019-08-12 06:20:06
【问题描述】:

我有点新节点。最近我决定创建一个博客系统,它有一个由护照模块和本地策略创建的授权系统。 我使用护照文件和一些视频教程来设计它,但我不明白它是如何工作的,我不明白其中的逻辑。 我有一个登录表单,它有两个字段(用户名、密码)和一个提交按钮。 你可以在这里看到我的 login.jade 代码。它是用玉模板语言编写的,并使用语义 UI(类似于引导程序)。

  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);
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      查看 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 2019-04-12
        • 2015-03-20
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多