【问题标题】:Passport Serialization and Deserialization Vs JWTPassport 序列化和反序列化与 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,
  });
})

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

【问题讨论】:

    标签: node.js authentication jwt passport.js cookie-session


    【解决方案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 会发生什么。 ?
    • 我已经看过那个帖子了。从那篇文章中,我只能认为passport.serializeUser 方法将用户信息保存在会话中。现在让我将我的问题分解为 2 个简单的问题, - 1. passport.serializeUserpassport.deserializeUser 是基于会话的身份验证过程的一部分。我在这里吗? 2. passport-jwt 可以用作替代身份验证过程(基于令牌的过程)。如果我在这里也错了,请纠正我。谢谢。
    • 其实session没用,是可选的。在我的代码中,会话属性处于关闭状态......您在路由器中使用的中间件(passport.authenticate(...))让您可以在 req 变量中使用用户。所以你可以通过在路由器 req.user 中编码来获取你的用户
    • @Roshan,你有没有想过这个问题,试图理解同样的事情。
    猜你喜欢
    • 2018-03-30
    • 2018-07-23
    • 2011-06-25
    • 2012-03-17
    • 2013-10-16
    • 2018-01-05
    相关资源
    最近更新 更多