node.js - 了解 Passport 序列化反序列化

标签 node.js authentication express serialization passport.js

您如何向外行解释 Passport 的序列化和反序列化方法的工作流程。

  1. passport.serializeUser 被调用后,user.id 去哪儿了?

  2. 我们在它之后调用 passport.deserializeUser 它在工作流中的什么位置?

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id); 
       // where is this user.id going? Are we supposed to access this anywhere?
    });
    
    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });
    

我仍在努力解决它。我有一个完整的工作应用程序并且没有遇到任何类型的错误。

我只是想了解这里到底发生了什么?

感谢任何帮助。

最佳答案

  1. Where does user.id go after passport.serializeUser has been called?

用户 ID(您作为 done 函数的第二个参数提供)保存在 session 中,稍后用于通过 deserializeUser 函数检索整个对象.

serializeUser 确定用户对象的哪些数据应该存储在 session 中。 serializeUser 方法的结果以 req.session.passport.user = {} 的形式附加到 session 。例如,它会是(因为我们提供用户 ID 作为键)req.session.passport.user = {id: 'xyz'}

  1. We are calling passport.deserializeUser right after it where does it fit in the workflow?

deserializeUser 的第一个参数对应于提供给 done 函数的用户对象的键(参见 1.)。因此,您的整个对象都是在该键的帮助下检索的。这里的键是用户 ID(键可以是用户对象的任何键,即姓名、电子邮件等)。 在 deserializeUser 中,该键与内存数组/数据库或任何数据资源匹配。

获取的对象作为req.user

附加到请求对象

视觉流

passport.serializeUser(function(user, done) {
    done(null, user.id);
});              │
                 │ 
                 │
                 └─────────────────┬──→ saved to session
                                   │    req.session.passport.user = {id: '..'}
                                   │
                                   ↓           
passport.deserializeUser(function(id, done) {
                   ┌───────────────┘
                   │
                   ↓ 
    User.findById(id, function(err, user) {
        done(err, user);
    });            └──────────────→ user object attaches to the request as req.user   
});

关于node.js - 了解 Passport 序列化反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27637609/

相关文章:

node.js - 快速路由将变量传递到所需文件

javascript - 如何在NodeJS中的MySQL查询中增加外部变量值

javascript - 如何将 Ember.JS 与数据库连接?

android - 将图像发送到 Node 服务器并调用 OCR microsoft vision API

javascript - 从服务器(NodeJS)到浏览器的 Javascript 序列化

在服务器上找不到 CSS 样式表?

authentication - .NET Core 2 Api 与 Azure AD 和 Windows 身份验证

c# - 使用 ServiceStack 使用 REST web 服务时的用户身份验证

facebook - Spotify Windows 桌面应用程序如何对用户进行身份验证?

node.js - 如何使用 google 数据存储(在 javascript 中)创建模式?