验证用户名和密码失败 - 客户端会话

时间:2016-03-22 17:04:43

标签: javascript html node.js express

我正在尝试调整一些代码:

https://github.com/expressjs/express/blob/master/examples/auth/index.js

并合并到登录表单中。问题是,在运行代码并选择登录按钮时,控制台中会记录以下内容:

POST /login
Authenticating undefined:foobar
Authentication failed, please check your  username and password. (use "tj" and "foobar")

当我输入tj和foobar作为登录名和密码时,我不确定为什么用户被返回为未定义。

HTML:

<div class="login">
      <form method="post" action="/login">
        <p><input type="text" name="login" value="" placeholder="Username"></p>
        <p><input type="password" name="password" value="" placeholder="Password"></p>
        <p class="remember_me">
          <label>
            <input type="checkbox" name="remember_me" id="remember_me">
            Remember me on this computer
          </label>
        </p>
        <p class="submit"><input type="submit" name="commit" value="Login"></p>
      </form>
</div>
<div class="login-help">
      <p>Forgot your password? <a href="/">Click here to reset it</a>.</p>
</div>

JS:

/**
 * Module dependencies.
 */
var express = require('express');
var hash = require('./pass').hash;
var bodyParser = require('body-parser');
var session = require('client-sessions');
var app = module.exports = express();

// dummy database
var users = {
  tj: { name: 'tj' }
};

// when you create a user, generate a salt
// and hash the password ('foobar' is the pass here)
hash('foobar', function (err, salt, hash){
  if (err) throw err;
  // store the salt & hash in the "db"
  users.tj.salt = salt;
  users.tj.hash = hash;
});

// check if user is logged in, if not redirect them to the index
function requireLogin (req, res, next) {
  if (!req.user) {
    res.redirect('/');
  } else {
    next();
  }
};

// Authenticate using our plain-object database
function authenticate(name, pass, fn) {
  if (!module.parent) console.log('Authenticating %s:%s', name, pass);
  var user = users[name];
  // query the db for the given username
  if (!user) return fn(new Error('cannot find user'));
  // apply the same algorithm to the POSTed password, applying
  // the hash against the pass / salt, if there is a match we
  // found the user
  hash(pass, user.salt, function(err, hash){
    if (err) return fn(err);
    if (hash == user.hash) return fn(null, user);
    fn(new Error('invalid password'));
  });
}

app.post('/login', function (req, res){
  console.log("POST /login")
  authenticate(req.body.username, req.body.password, function(err, user){
    if (user) {
      // Regenerate session when signing in
      // to prevent fixation
      req.session.regenerate(function(){
        // Store the user's primary key
        // in the session store to be retrieved,
        // or in this case the entire user object
        req.session.user = user;
        /*req.session.success = 'Authenticated as ' + user.name
          + ' click to <a href="/logout">logout</a>. '
          + ' You may now access <a href="/restricted">/restricted</a>.';*/
        res.redirect('/queryInterface.html');
      });
    } else {
      console.log('Authentication failed, please check your '
        + ' username and password.'
        + ' (use "tj" and "foobar")');
      res.redirect('/');
    }
  });
});

1 个答案:

答案 0 :(得分:1)

您看到用户未定义,因为您使用req.body来访问undefined输入字段。

您正在使用req.body.username进行身份验证,但输入字段的名称为login

req.body会填充input字段的名称。尝试通过input访问用户名时,req.body.username应该如下所示。

<input type="text" name="username" value="" placeholder="Username">