node.js - Passport/Express:在注册时创建新用户后无法验证用户
问题描述
我有一个 NodeJS/Express 服务器正在运行。我正在使用来自身份验证的 PassportJS。
我已成功创建登录功能。我能够成功登录服务器启动时已经存在的用户。
我无法成功验证新用户。用户创建成功,护照认证似乎通过了。但是当重定向并被isAuthenticated
调用时。它返回假。
我已经尝试过使用我在登录身份验证中使用的内容。我已经尝试过最简单的护照身份验证版本。我研究了许多 SO 答案并查阅了文档
当前相关代码:
passport.use(
new localStrategy(
{ usernameField: "userName" },
(userName, password, done) => {
const userList = getUsersByUserName(userName);
if (!userList[0]) {
return done(null, false, {
message: "Invalid Username or Password.\n",
});
}
if (password !== userList[0].password) {
return done(null, false, {
message: "Invalid Username or Password.\n",
});
}
return done(null, userList[0]);
}
)
);
passport.serializeUser((user: User, done) => {
done(null, user.userID);
});
passport.deserializeUser((id, done) => {
const user = users[0].userID === id ? users[0] : false;
done(null, user);
});
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.post("/login", (req, res, next) => {
passport.authenticate("local", (perr, user, info) => {
if (info) {
return res.send("Invalid Username or Password.");
}
if (perr) {
return next(perr);
}
if (!user) {
return res.redirect("/");
}
req.login(user, (lerr) => {
if (lerr) {
return next(lerr);
}
return res.send(user); // I am redirecting in the client code
});
})(req, res, next);
});
app.post("/register", (req, res, next) => {
const userName = req.body.userName;
const name = req.body.name;
const email = req.body.email;
const password = req.body.password;
const cpassword = req.body.cpassword;
if (!name) {
return res.send("Please enter a Name");
}
if (!userName) {
return res.send("Please enter a Username");
}
if (!email) {
return res.send("Please enter an Email");
}
if (password !== cpassword) {
return res.send("Passwords do not Match");
}
if (password.length < 4) {
return res.send("Password must be at least 4 characters");
}
const userList: User[] = getUsersByUserName(userName);
if (userList.length > 0) {
return res.send("That username is already taken");
}
const newUser: User = {
userID: uuid(),
userName,
password,
email,
name,
};
users.push(newUser);
passport.authenticate("local", (perr, user, info) => {
if (info || !user) {
return res.send("Invalid Username or Password.");
}
if (perr) {
return next(perr);
}
req.login(user, (lerr) => {
if (lerr) {
return next(lerr);
}
return res.send(user);
});
})(req, res, next);
});
function isAuthenticated(req: any, res: any, next: any) {
if (req.isAuthenticated()) {
return next();
}
return res.redirect("/");
}
遵循注册护照身份验证时。我看到的结果让我相信应该对用户进行身份验证。但是当用户被重定向并被isAuthenticated
调用时。我收到假的
Update
我正在使用session-file-store
. 会话在没有用户 ID 的情况下存储...
Logging in: {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"__lastAccess":1564192764406,"passport":{"user":"7fa35b71-8733-441e-afcd-ed68defa68bf"}}
Registering a new user: {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"__lastAccess":1564193852150,"passport":{}}
解决方案
passport.deserializeUser((id, done) => {
const user = getUser(id as string);
// const user = users[0].userID === id ? users[0] : false;
done(null, user);
});
我正在比较第一个用户,而不是使用 id 查找用户.... 大失败。
推荐阅读
- python - 如何检查顶点匹配并替换边缘上的重复索引?
- dia - Block Dia Diagram Editor 保存文件的备份副本
- css - 使用 ` 为 SVG 生成 IMG src 数据 URI
- python-3.x - 如何根据时间戳从数据框中删除重复条目?
- python - pip install pywin32 在 mac 机器上失败
- windows - LLVM 在 Windows 上构建:跳过了 Visual Studio cl.exe
- c# - Emgu GetAverage 图像的黑色颜色
- javascript - TypeError:Discord.Streaming 不是函数
- r - ggsave 不保存仅最后一个情节
- google-apps-script - 如何在谷歌应用程序脚本中包含 aws cognito 身份验证?