如何使用nodejs和express进行基于令牌的身份验证来正确地进行虚拟用户登录
我对Web开发非常陌生,一直使用this Udemy课程作为指南和Google。我必须创建一个“虚拟用户”才能登录我的网站,并且我的项目说我无法使用注册来创建用户。
[我所做的是使用Robo 3T使用Mongo在userDB上手动输入用户名和密码。该登录名有效,但是如果我输入的错误登录名与数据库中的登录名不匹配,则该网站将卡住并继续尝试“加载”。我也对如何进行基于令牌的登录身份验证感到困惑,并且希望获得更多指导,我正在关注的指南是有关数据库加密和Google的OAuth 2.0。
login.ejs
<!-- Makes POST request to /login route -->
<form action="/login" method="POST">
<div class="form-group">
<label for="username">Username</label>
<input type="text" class="form-control" name="username">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password">
</div>
<button type="submit" class="btn btn-dark">Login</button>
</form>
app.js
//connect to mongodb
mongoose.connect("mongodb://localhost:27017/userDB",{useNewUrlParser: true});
const userSchema = {
username: String,
password: String
};
const User = new mongoose.model("User", userSchema);
app.get("/",function(req,res){
res.render("home"); //render home.ejs
});
app.get("/login",function(req,res){
res.render("login"); //render login.ejs
});
app.post("/login", function(req,res){
const username = req.body.username;
const password = req.body.password;
User.findOne({username: username}, function(err, foundUser){
if (err){
console.log(err);
res.redirect("/login");
} else{
if (foundUser){
if (foundUser.password === password){
res.redirect("counter");
}
}
}
});
});
如果该用户使用我创建的一个虚拟用户中没有的用户名和密码登录,我只希望它给出一个错误(也许是一个弹出窗口?),然后重新加载回login.ejs。
谢谢您的帮助!
回答如下:问题可能是foundUser
为空或密码不匹配时,您没有返回任何内容。
[如果有任何错误,您可以使用查询参数(err)将其重定向到/login
路由,客户端可以在页面加载时使用JS读取该参数。如果存在非空查询参数err
,则将其读取并在某些弹出窗口中显示。
res.redirect("/login?err=The username does not exist");
//connect to mongodb
mongoose.connect("mongodb://localhost:27017/userDB", {
useNewUrlParser: true
});
const userSchema = {
username: String,
password: String
};
const User = new mongoose.model("User", userSchema);
app.get("/", function(req, res) {
res.render("home"); //render home.ejs
});
app.get("/login", function(req, res) {
res.render("login"); //render login.ejs
});
app.post("/login", function(req, res) {
const username = req.body.username;
const password = req.body.password;
try {
User.findOne({
username: username
}, function(err, foundUser) {
if (err || !foundUser) {
return res.redirect("/login?err=The username does not exist");
}
if (foundUser.password !== password) {
// you can use bcryptjs for hashing and comparing hashed values.
return res.redirect("/login?err=The username or password is invalid");
}
res.redirect("/counter");
});
} catch (error) {
res.redirect("/login?err=something went wrong!");
}
});