登录Node.js时如何验证电子邮件和密码

时间:2019-11-15 06:44:15

标签: node.js

我现在才开始学习nodejs,我编写了用于登录的api,并使用bcrypt npm对密码进行了加密。现在,我想验证电子邮件和密码。逻辑应该是这样的:只有注册用户才有资格登录,并且给定的密码也应该匹配。注册时该密码必须相同。

这两个条件要相互匹配,它在控制台中会显示错误消息,例如:如果电子邮件地址错误,则必须显示“找不到用户”。如果他输入了错误的密码,则必须显示“请输入有效的密码”。如果两者都正确,则必须显示“用户已成功登录”。

如果我不确定是否有疑问,请发表评论。

这是登录Api:

app.post("/api/login", async (req, res) => {
  // console.log(req.body)

  const loginInfo = {
    email: req.body.email,
    password: req.body.password
  };

  // console.log(loginInfo)

  const log = Login.find(
    { email: req.body.email },
    { password: req.body.password }
  );

  console.log(log);

  if (email == email && password == password) {
    console.log(loggedsucessfully);
  } else {
    console.log(invalidlogin);
  }

  const hash = await bcrypt.hash(req.body.password, saltRounds);
  req.body.password = hash;
  // console.log(req.body)

  const loggedUsers = new Login(req.body);

  try {
    const result = await loggedUsers.save();
    res.json(result);
  } catch (error) {
    res.status(400).json({ message: "sorry something went wrong" });
  }
});

这些是我安装的npms:

const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
const bcrypt = require('bcrypt');
const saltRounds = 10;
require('./models/db');
const Jobs = require('./models/job');
const Users = require('./models/user')
const Login = require('./models/login')
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

这是数据库db.js:

const mongoose = require("mongoose");
mongoose
  .connect("mongodb://localhost:27017/jobsdb", {
    useNewUrlParser: true,
    useUnifiedTopology: true
  })
  .then(() => {
    console.log("Connected");
  })
  .catch(error => {
    console.error(error);
  });

这是架构login.js

const mongoose = require(`mongoose`);

const loginSchema = new mongoose.Schema({
  email: { type: String, required: true, trim: true },
  password: { type: String, required: true, trim: true }
});

const Login = mongoose.model("login", loginSchema);
module.exports = Login;

3 个答案:

答案 0 :(得分:0)

我在medium上找到了解决方案。您可以编写一个“验证”功能并在搜索数据库之前检查电子邮件。

const Joi = require('@hapi/joi');

function validateUser(user) {
  const schema = {
    name: Joi.string().min(3).max(50).required(),
    email: Joi.string().min(5).max(255).required().email(),
    password: Joi.string().min(3).max(255).required()
  };

  return Joi.validate(user, schema);
}
app.post('/api/login', async (req, res) => {
   const { error } = validateUser(req.body);
   if (error) return res.status(400).send(error.details[0].message);
   ...
}

答案 1 :(得分:0)

首先,我们需要找到具有给定电子邮件的用户。 如果用户不是虚假的,那么我们需要将给定的密码与找到的用户的密码进行比较。如果相等,则登录成功。

您可以使用以下路线:

router.post("/api/login", async (req, res) => {
  try {
    const { email, password } = req.body;

    let user = await User.findOne({ email });

    if (!user) return res.status(400).send("User not found");

    const validPassword = await bcrypt.compare(password, user.password);

    if (!validPassword) return res.status(400).send("Please enter a valid password.");

    //at this point, login is successfull, return the user info without the password info
    user.password = undefined;

    res.send(user);
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

答案 2 :(得分:0)

我建议在模式模型中使用方法 https://mongoosejs.com/docs/guide.html#methods

例如,如果要验证密码,请添加方法validPassword

loginSchema.methods.validPassword = function( pwd ) {
    return ( this.password === pwd );
};

然后

   loginSchema.findOne({ password: req.body.password }, function (err, login) {
        if (err) { return done(err); }
        if (!login) {
            return done(null, false, { message: 'Incorrect login.' });
        }
        if (!login.validPassword(password)) {
            return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, login);
    });