passport中的req.login是什么意思?

11

我在我的应用中使用多个护照策略。

现在,既然我正在使用多个护照策略来连接(而不仅仅是登录),我决定上Google查找如何实现它。

这就是我偶然发现的代码。

 passport.authenticate('meetup', (err, user, info) => {
        if (err) { return next(err); }
        if (!user) { return res.redirect(process.env.CLIENT_ADDRESS); }
        req.logIn(user, function(err) {
            if (err) { return next(err); }
            return res.redirect(process.env.CLIENT_ADDRESS);
          });

在这里,我无法理解正在发生的事情,比如第一个问题,if (!user)是什么意思?它是否指的是req.user

其次,有req.logIn()

根据护照文档

Passport在req上暴露了一个login()函数(也称为logIn()),可用于建立登录会话。

并且

当登录操作完成后,用户将被分配给req.user。

那么使用serializer/deserializer与使用req.login有什么区别?

此外,在回调中,我们总是可以这样做

  passReqToCallback: true
  }, (req, accessToken, refreshToken, params, profile, cb) => { 

获取req

总结一下,有人能帮我理解上面的代码片段吗?


可能是Passport.js如何在会话中存储用户对象?的重复问题。 - AdamSchuld
请查看控制流的描述:https://github.com/jaredhanson/passport/issues/208#issuecomment-113445331 - Ben Creasy
4个回答

6
在高层次上,Passport.js 是一种中间件,它在请求/响应头(通常是会话 cookie)中“序列化”用户身份。这个序列化步骤意味着它正在接收标识用户的登录信息,并生成一个表示用户的新对象。将这个对象视为只有 Passport 知道如何解释的钥匙卡。
当用户进行其他 API 请求时,他们会传回相同的标识头。Passport 通过“反序列化”对其进行身份验证,以确定是哪个用户发出了该请求。 req.login() 是生成用户会话的神奇方法。这个会话代表了登录有效期,无需重新进行身份验证。
让我们来看一下你片段的开头:
 passport.authenticate('meetup', (err, user, info) => {
   ...
   if (!user) { return...

在这段代码中,passport被设置为中间件。当请求到来时,passport在后台已经通过反序列化cookie解释了请求头,并确定它是否代表一个用户。如果没有用户或请求头不代表用户,则请求未经授权。

4

req.login作为req.logIn的别名

  1. Passport在req上暴露了一个login()函数(也被命名为logIn()),可以用于建立登录会话。
  2. 当登录操作完成后,用户将被分配到req.user中。
  3. 注意:passport.authenticate()中间件会自动调用req.login()函数。

-1

对于这个功能,请使用较低版本的passport v0.4.1

您可以通过以下方式进行安装

npm install passport@^0.4.1

你的req.login函数应该与该版本兼容。


-1
我到今天还存在这个问题 我的问题是,护照在设置Set-Cookie之前需要将用户写入会话存储,而这个过程是异步的。
这是我的解决方案。
const { promise, resolve, reject } = deferred();
req.login(user, (err) => {
      if (err) {
        reject(err);
      } else {
        resolve(user);
      }
    });
    await promise;
    const url = this.urlService.getRedirectUrl();
    return redirect(url);

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