首页 > 解决方案 > 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":{}}

标签: node.jstypescriptexpressauthenticationpassport.js

解决方案


passport.deserializeUser((id, done) => {

  const user = getUser(id as string);
  // const user = users[0].userID === id ? users[0] : false;
  done(null, user);
});

我正在比较第一个用户,而不是使用 id 查找用户.... 大失败。


推荐阅读