我有一个标准的 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
?这样我就可以在验证后一次性登录用户。之后,用户将使用他们的密码进行身份验证。或者还有其他方法可以达到这个结果吗?
答案 0 :(得分:1)
对于这种情况,您应该根据 jwt
创建一个如下所示的链接并发送到使用电子邮件:
https://website/verify#token=eyJpZCI6Nzk5OTEwNzc3NjMyMzI1NjU0LCJlbWFpbCI6Im0ueS5haG
这个令牌应该存储在一个有两列token
和status
的新表中,点击电子邮件中的链接后,状态首先是true
,{{1} } 路由被调用,状态将为 /verify
并且对令牌无效,因此如果令牌有效且状态为真,您可以将用户重定向到主页,没有护照您可以做您想做的事
``
答案 1 :(得分:1)
其实很容易解决这个问题。我添加了另一列 (isInitialVerification BOOLEAN NOT NULL DEFAULT FALSE
)。然后,在 /verify
路线上,我将 isIntialVerification
设置为 true。在 Passport LocalStrategy
中,我只是检查了列值,然后将其重置为 false。
如果无法将 done(err, ...)
值更新回 false,请确保抛出错误(即返回 isInitialVerification
),以避免潜在的永久身份验证 -最坏的情况是他们必须手动登录。
以上说法不正确。任何人都可以在 isInitialVerification
和下一个请求之间发送请求,并进行身份验证。请参阅 Mohammad 的回答以获取可能的解决方案