Passport 序列化和反序列化与 JWT
Posted
技术标签:
【中文标题】Passport 序列化和反序列化与 JWT【英文标题】:Passport Serialization and Deserialization Vs JWT 【发布时间】:2019-08-14 09:47:44 【问题描述】:我在我的应用程序中使用passport-local
、passport-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.serializeUser
和passport.deserializeUser
会发生什么。 ?
这可以帮助你:***.com/questions/27637609/…
我已经看过那个帖子了。从那篇文章中,我只能认为passport.serializeUser
方法将用户信息保存在会话中。现在让我将我的问题分解为 2 个简单的问题, - 1. passport.serializeUser
和 passport.deserializeUser
是基于会话的身份验证过程的一部分。我在这里吗? 2. passport-jwt
可以用作替代身份验证过程(基于令牌的过程)。如果我在这里也错了,请纠正我。谢谢。
其实session没用,是可选的。在我的代码中,会话属性处于关闭状态......您在路由器中使用的中间件(passport.authenticate(...))让您可以在 req 变量中使用用户。所以你可以通过在路由器 req.user 中编码来获取你的用户
@Roshan,你有没有想过这个问题,试图理解同样的事情。以上是关于Passport 序列化和反序列化与 JWT的主要内容,如果未能解决你的问题,请参考以下文章