Passport 序列化和反序列化与 JWT

Posted

技术标签:

【中文标题】Passport 序列化和反序列化与 JWT【英文标题】:Passport Serialization and Deserialization Vs JWT 【发布时间】:2019-08-14 09:47:44 【问题描述】:

我在我的应用程序中使用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,
  );
)

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

【问题讨论】:

【参考方案1】:

这里使用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 (or another method)函数中可以使用时序列化为json。

【讨论】:

其实我想了解更多,如果我不使用passport.serializeUserpassport.deserializeUser 会发生什么。 ? 这可以帮助你:***.com/questions/27637609/… 我已经看过那个帖子了。从那篇文章中,我只能认为passport.serializeUser 方法将用户信息保存在会话中。现在让我将我的问题分解为 2 个简单的问题, - 1. passport.serializeUserpassport.deserializeUser 是基于会话的身份验证过程的一部分。我在这里吗? 2. passport-jwt 可以用作替代身份验证过程(基于令牌的过程)。如果我在这里也错了,请纠正我。谢谢。 其实session没用,是可选的。在我的代码中,会话属性处于关闭状态......您在路由器中使用的中间件(passport.authenticate(...))让您可以在 req 变量中使用用户。所以你可以通过在路由器 req.user 中编码来获取你的用户 @Roshan,你有没有想过这个问题,试图理解同样的事情。

以上是关于Passport 序列化和反序列化与 JWT的主要内容,如果未能解决你的问题,请参考以下文章

Passport js 序列化用户和反序列化用户

当护照js中的序列化和反序列化调用时

快速会话和 Cookie

护照反序列化用户未在帆中调用

Passport.js 异步与同步反序列化

无法反序列化当前的JSON对象,为啥