passport.initialize()是什么?(Node.js Express)

28

我现在正在尝试在我的应用程序中使用护照模块。

我正在阅读一些手册,其中有这么说:

app.use(passport.initialize());
app.use(passport.session());

app.use(passport.initialize())是做什么的?

passport.session()可能是给Passport使用会话信息的,

但我对passport.initialize()一无所知。


一个相关的问题在Github上:https://github.com/jaredhanson/passport/issues/868#issuecomment-1632433930 - aderchox
3个回答

32

passport.initialize() 是一个中间件,用于初始化 Passport

中间件 是一些函数,它们具有访问请求对象(req)、响应对象(res)以及应用程序请求-响应周期中下一个中间件函数的能力。

Passport 是一个认证中间件,可对 Node 请求进行认证。

因此,passport.initialize() 主要用于初始化认证模块。

passport.session() 是另一个中间件,用于更改请求对象并将当前会话 ID(来自客户端 cookie)的“user”值更改为真正反序列化的用户对象。这里详细解释了它。


28
有时候最好查看代码:passport github 的 initialize() 函数 简述: 使用会话(sessions)时,initialize() 函数会设置序列化/反序列化用户数据的函数。
如果您不使用会话(sessions),则不需要使用 passport.initialize()
/**
 * Passport initialization.
 *
 * Intializes Passport for incoming requests, allowing authentication strategies
 * to be applied.
 *
 * If sessions are being utilized, applications must set up Passport with
 * functions to serialize a user into and out of a session.  For example, a
 * common pattern is to serialize just the user ID into the session (due to the
 * fact that it is desirable to store the minimum amount of data in a session).
 * When a subsequent request arrives for the session, the full User object can
 * be loaded from the database by ID.
 *
 * Note that additional middleware is required to persist login state, so we
 * must use the `connect.session()` middleware _before_ `passport.initialize()`.
 *
 * If sessions are being used, this middleware must be in use by the
 * Connect/Express application for Passport to operate.  If the application is
 * entirely stateless (not using sessions), this middleware is not necessary,
 * but its use will not have any adverse impact.
...

2
你好,使用JWT令牌时是否真的不需要使用passport.initialize()呢? - Fabian Bosler
1
@FabianBosler passport.initialize() 是否与使用 session 有关,这取决于您实现 JWT 认证的方式。目前我无法告诉您更多信息。 - jpenna
你的回答解决了我的好奇心,谢谢! - Aditya Kresna Permana

7

根据Passportjs文档:

在基于Connect或Express的应用中,需要使用passport.initialize()中间件来初始化Passport。如果您的应用程序使用持久登录会话,则还必须使用passport.session()中间件。

如果我们查看源代码, 我们可以看到passport.initialize()中间件基本上将passport实例添加到传入请求中,以便可以进行身份验证策略。
如果有会话,它也会被添加到请求中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接