Passport身份验证唯一会话ID概念

时间:2017-05-01 02:36:44

标签: javascript authentication passport.js

因此,根据我的理解,Passport将为任何用户生成唯一的会话ID,即使他们未经身份验证。一旦他们进行身份验证,服务器就可以将userId(通常来自数据库)与此会话ID相关联。

我正在查看代码,看起来像passport.serialize将userId存储在会话中,然后passport.deserialize获取存储在会话中的用户ID并查询数据库以获取更多用户信息< / p>

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

passport.deserializeUser(function(id, done) {
    User.findById(id)
      .then(user => done(null, user))
      .catch(err => done(err));
});

我真正看到的是独特的sessionId。如果userId存储在会话中,那么任何人都不能欺骗userId并获取用户信息吗?或者是sessionId和userId之间的映射是否由Passport执行?

1 个答案:

答案 0 :(得分:1)

是的,在正常情况下,Passport会创建唯一的会话密钥,然后使用您在应用启动时配置它时提供的密码对其进行加密。该密钥的加密形式作为cookie头发送到客户端,这对于客户端破解来说计算成本很高。

当客户端在下一个请求中发回该cookie时,Passport使用相同的秘密从cookie中提取存储的会话密钥以解密它,然后将该值传递给deserializeUser回调以获取您拥有的任何相关信息。

其中的一些细节因某些策略而异(例如JWT策略不使用cookie,它使用作为标题发送的JWT令牌本身),但一般模式是相同的。