首页 > 解决方案 > 通过 node.js 和 sqlite3 验证用户名和密码

问题描述

我有一个包含用户名和密码的表格,当有人在网页上输入它们时,我想对其进行身份验证。如果用户名和密码匹配,它会重定向到某个页面,如果不匹配,则会重定向到另一个页面。

我正在做的是使用 Select 语句仅选择输入信息的用户名和密码匹配的行。因此,在生成的查询中,如果用户名和密码匹配,则要么只有一行,要么没有。

我遇到的问题是它只不断重定向到第一页。我假设它与响应有关,但我无法弄清楚。任何帮助将非常感激。

app.post('/Login', function (req, res, next) {

let sql = `SELECT * FROM Login WHERE (username = "${req.body.username}" AND password = "${req.body.password}")`
var x;

db.all(sql, function (err, rows) {
    rows.forEach(function (row) {
        if (row.username = req.body.username) {
            x = 1;
        }
        else {
            x = 2;
            db.close();
        }
    })
    if (x = 1) {
        res.redirect('/index3');
    }
    else { res.redirect('/index2'); }

})

标签: htmlnode.jssqlite

解决方案


rows.forEach在 in和 after内部调用函数rows.forEach,你有if声明而不是比较符号==or ===,你有分配符号=,我认为这是一个问题。

if (row.username === req.body.username) {
  x = 1;
}

if (x === 1) {
    res.redirect('/index3');
}

尝试这个:

app.post('/Login', (req, res, next) => {
 let sql = `SELECT * FROM Login WHERE username = "${req.body.username}" AND password = "${req.body.password}"`;
 var x;

 db.all(sql, (err, rows) => {
  if (err) {
    next(err);
    return;
  }
  if (!rows) {
    res.status(400);
    res.send('Invalid username or password');
    return
  }
  rows.forEach((row) => {
    if (row.username === req.body.username && row.password === req.body.password) {
        x = 1;
    }
    else {
        x = 2;
        db.close();
    }
  })
  if (x === 1) {
    res.redirect('/index3');
  }
  else { res.redirect('/index2'); }
 })

重要的!永远不要以明文形式存储用户密码。在插入数据库之前始终对它们进行哈希处理。用于存储密码的良好哈希函数:bcrypt.


推荐阅读