护照序列化和反序列化 vs JWT

3
我在我的应用程序中使用passport-localpassport-jwt模块进行身份验证策略。我正试图理解是否仍需要使用passport.serialize()passport.deserialize()方法。据我所知,这些方法使用会话来存储用户信息。我怀疑使用这些方法的目的已经通过JwtStrategy实现了。或者我完全错了吗?
我尝试在网络上查找,但没有得到太多信息。
以下是我的JWT策略代码:
router.get('/current', passport.authenticate('jwt', {session: false}), (req, res) => {
  res.json({
    id: req.user.id,
    email: req.user.email,
    first_name: req.user.first_name,
    last_name: req.user.last_name,
  });
})

如果我的假设有误,请纠正我。

2个回答

2

这里使用了JWT策略。

passport.authenticate('jwt', {session: false})

这段代码是一个中间件,它从请求头的授权部分获取令牌密钥,然后检查令牌密钥是否正确,并触发passport.use(new JwtStrategy(opts, (jwt_payload, done)方法。

然后,你的代码(我猜应该是这样的):

passport.serializeUser(function (user, done) {
    done(null, user);
});

passport.deserializeUser(function (user, done) {
    done(null, user);
});

// jwt
let opts = {
    jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('jwt'),
    secretOrKey: "secret"
};

passport.use(new JwtStrategy(opts, (jwt_payload, done) => {

    UserRepository.get_user_by_id(jwt_payload.user.id, (err, user) => {
        if (err) {
            return done(err, false);
        }
        if (user) {
            return done(null, UserRepository.set_existing_user_for_token_key(user));
        } else {
            return done(null, false);
        }
    });
}));

返回一个用户, 然后在你可以在router.get(或其他方法)函数中使用时进行序列化为JSON。


实际上,我想更深入地了解一下,如果我不使用 passport.serializeUserpassport.deserializeUser 会发生什么? - Roshan
1
这可能会对你有所帮助:https://dev59.com/614c5IYBdhLWcg3wssBs?rq=1 - canmustu
我已经阅读了那篇文章。从那篇文章中,我认为passport.serializeUser方法将用户信息保存在会话中。现在让我把我的问题分成两个简单的问题:
  1. passport.serializeUserpassport.deserializeUser是会话验证过程的一部分。我说得对吗?
  2. passport-jwt可以作为替代身份验证过程(基于令牌的过程)。如果我错了,请纠正我。 谢谢。
- Roshan
实际上,不必使用会话,这是可选的。在我的代码中,会话属性已关闭......您在路由器中使用的中间件(passport.authenticate(...))允许您在req变量中使用用户。因此,您可以通过在路由器中编写req.user来获取用户。 - canmustu
@Roshan,你最终解决了这个问题吗?我也在尝试理解同样的事情。 - Patrick Weaver
我也在尝试弄清楚这个问题。据我所知,如果我们使用会话,我们可以使用passport serializeUser/DeserializeUser,或者我们可以使用passport-JWT。最终,这取决于我们想要使用JWT还是会话。如果我错了,请纠正我。 - Hendry Lim

0
如果您正在使用JwtStrategy,那么您已经明白,您不需要session。因此,您可以摆脱passport.serializeUserpassport.deserializeUser
您的假设是正确的,我可以说我在一些应用程序中使用相同的实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接