javascript - Passport 无法读取未定义的属性“密码”
问题描述
我目前正在使用 Express、Node、Mongoose 和 Passport.js 开发注册和登录系统,并且注册大部分工作正常(除了successRedirect 不起作用),但是登录系统存在一个大问题。由于某种原因,在我创建护照的方法中,无法读取未定义的“密码”,因此出现了未定义的内容,但我似乎无法弄清楚。另外,如果有人知道为什么我在注册路线上的 successRedirects 不起作用,将不胜感激!
护照配置文件:
var LocalStrategy = require("passport-local").Strategy;
const User = require("../user");
const passport = require("passport");
const crypto = require("crypto");
//Signup method
module.exports = (passport) => {
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
};
passport.use(
"local-signup",
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
passReqToCallback: true,
},
(req, email, password, done) => {
process.nextTick(() => {
User.findOne({ email: email }, (err, user) => {
if (err) {
return done(err);
}
if (user) {
return done(
null,
false,
req.flash("signupMessage", "That email is already taken.")
);
} else {
let token = crypto.randomBytes(64).toString("hex");
const user = new User();
user.name = req.body.username;
user.email = email;
user.password = user.generateHash(password);
user.verificationHash = token;
user.save();
}
});
});
}
)
);
// Login method
passport.use(
"local-login",
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
passReqToCallback: true,
},
(req, email, password, done) => {
User.findOne({ email: email }, (err, user) => {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, req.flash("loginMessage", "No user found."));
}
if (!user.validPassword(password)) {
return done(
null,
false,
req.flash("loginMessage", "Oops! Wrong password")
);
}
return done(null, user);
});
}
)
);
index.js 路线:
app
.route("/register")
.get((req, res) => {
res.render("register", { message: req.flash("signupMessage") });
})
.post(
passport.authenticate("local-signup", {
successRedirect: "/verify/emailSent",
failureRedirect: "/register",
failureFlash: true,
}),
(req, res) => {
}
);
app
.route("/login")
.get((req, res) => {
res.render("login", { message: req.flash("loginMessage") });
})
.post(
passport.authenticate("local-login", {
successRedirect: "/verify/emailSent",
failureRedirect: "/login",
failureFlash: true,
}),
(req, res) => {
//if this gets called authentication was succesful.
//req.user is the authenticated user
}
);
登录文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<% if (message.length > 0) { %>
<div class="alert alert-danger"><%= message %></div>
<% } %>
<form action="/login" method="POST">
<label for="email">Email</label>
<input type="email" name="email" id="email" required />
<label for="password">Password</label>
<input type="password" name="password" id="password" required />
<button type="submit">Log in</button>
</form>
<a href="/register">Register</a>
<a href="/">Home</a>
</body>
</html>
解决方案
推荐阅读
- selenium - 如何使用 Selenium 和 Java 点击 reCAPTCHA
- c# - MVC 控制器无法找到 Api 控制器(同一项目)
- node.js - Javascript 类型错误(中间值)。超时不是函数
- python - 在 Pandas Concat pd.concat 的生成器中打印文件名
- machine-learning - LDA genism 仅使用 16 个核心中的一个
- python - 偏差方差权衡内存错误python
- youtube-api - Youtube Data API 返回无效数据
- bootstrap-4 - 重新排列响应式 Bootstrap 4 网格布局
- php - 垂直对齐的静态/引导问题
- c# - Csharp交换字符串中的动态值