javascript - Passport 认证唯一 session ID概念

标签 javascript authentication passport.js

据我了解,Passport 将为任何用户生成一个唯一的 session ID,即使他们未经身份验证。一旦他们通过身份验证,服务器就可以将用户 ID(通常来自数据库)与该 session ID 相关联。

我正在查看代码,它看起来像passport.serialize将userId存储在 session 中,然后passport.deserialize获取存储在 session 中的userid并查询数据库以获取更多用户信息

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存储在 session 中,那么任何人都不能欺骗userId并获取用户信息吗?或者sessionId和userId之间的映射是由Passport在幕后执行的吗?

最佳答案

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

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

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

关于javascript - Passport 认证唯一 session ID概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43713556/

相关文章:

PHP 和 JavaScript Ajax : how to get URL data when our method is "GET"

javascript - jQuery 小部件开发 - 我可以使用 MVC 模式吗?

javascript - Tablesorter 默认按 2 列排序

ios - AFURLSessionManager 身份验证

authentication - 如何使用 CloudFormation 在 EC2 实例启动时复制文件并添加动态内容?

node.js - 使用 MongoDB 和 Node.JS 创建 Passport-Local 新用户

Node.js Express + Passport + Cookie session n > 1 个服务器

javascript - Mongoose $push 不插入数组

java - 如何将身份验证 header 添加到WebService stub ?

node.js - 中间件中有没有更好的使用中间件的方法?