验证后无需密码对用户进行一次身份验证

时间:2021-01-10 00:03:16

标签: node.js authentication passport.js

我有一个标准的 LocalStrategy Passport.js 身份验证策略。在此期间,LocalStrategy 使用 bcrypt 根据数据库检查密码,并验证会话。如果您需要查看代码:

const LocalStrategy = passportLocal.Strategy;
const userStrategyHandler = async (username, password, done) => {
  const [ userFetchErr, user ] = await to(userService.findByEmail(username));

  // ...

    const authResult = await authService.comparePassword(password, user.password);

  // ...

  return done(null, user);
};

const userStrategy = new LocalStrategy(userStrategyHandler);
passport.use(userStrategy);

但是,当他们注册时,我会发送一封电子邮件来验证用户的帐户。当他们单击链接时,它当前会将他们重定向到主页。他们没有登录,这不是一个很好的用户体验,但在 /verify 路由中的重定向之前有机会潜在地让用户登录

有没有办法在服务器端对用户进行身份验证,而无需调用 Passport LocalStrategy?这样我就可以在验证后一次性登录用户。之后,用户将使用他们的密码进行身份验证。或者还有其他方法可以达到这个结果吗?

2 个答案:

答案 0 :(得分:1)

对于这种情况,您应该根据 jwt 创建一个如下所示的链接并发送到使用电子邮件:

https://website/verify#token=eyJpZCI6Nzk5OTEwNzc3NjMyMzI1NjU0LCJlbWFpbCI6Im0ueS5haG

这个令牌应该存储在一个有两列tokenstatus的新表中,点击电子邮件中的链接后,状态首先是true,{{1} } 路由被调用,状态将为 /verify 并且对令牌无效,因此如果令牌有效且状态为真,您可以将用户重定向到主页,没有护照您可以做您想做的事 ``

答案 1 :(得分:1)

其实很容易解决这个问题。我添加了另一列 (isInitialVerification BOOLEAN NOT NULL DEFAULT FALSE)。然后,在 /verify 路线上,我将 isIntialVerification 设置为 true。在 Passport LocalStrategy 中,我只是检查了列值,然后将其重置为 false。

如果无法将 done(err, ...) 值更新回 false,请确保抛出错误(即返回 isInitialVerification),以避免潜在的永久身份验证 -最坏的情况是他们必须手动登录。

以上说法不正确。任何人都可以在 isInitialVerification 和下一个请求之间发送请求,并进行身份验证。请参阅 Mohammad 的回答以获取可能的解决方案