使用 cookieSession 使用 Supertest 进行测试时,Passport 不会设置 req.user

spi*_*ner 5 node.js express supertest passport.js

我在使用 Express 的“cookieSession”使用 Supertest 测试 Express 应用程序时遇到问题。当我session从 Express使用时,一切正常,但cookieSession不能正确使用 PassportJS。

我正在使用 PassportJS 对用户进行身份验证并将用户设置为请求对象 (req.user)。所以/login按预期工作,它返回正确的set-cookie标头,但在下一个请求中,身份验证失败req.user,即使它正确反序列化/序列化用户,也不会使用用户对象设置属性

环境

版本:

  • 快递:4.16.2
  • PassportJS:0.3.2
  • 超级测试:2.0.1
  • 超级代理:2.3.0

这就是我初始化超级代理的方式:

import * as supertest from 'supertest';
import * as superagent from 'superagent';
import app from '../../app';
const request = supertest.agent(app);
Run Code Online (Sandbox Code Playgroud)

我在测试之前运行登录(使用异步/等待功能):

await request.post('/login').send({
  email: 'some@email.com',
  password: 'plainpassword'
});
Run Code Online (Sandbox Code Playgroud)

然后我向后端发出第一个请求以检索数据:

const readResponse: superagent.Response = await             
request.post('/getData').send(requestBody);
Run Code Online (Sandbox Code Playgroud)

这就是它失败的地方。它返回状态代码 401,因为 PassportJS 不提供用户数据来请求对象。也许它不在 req.user 中?

在 app.ts 中,我像这样设置了 cookieSession 和passportJS 会话:

app.use(cookieSession({
  keys: [process.env.SESSION_SECRET],
  maxAge: 24 * 60 * 60 * 1000 * 14 // 14 days
}));
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

但是:如果我使用普通会话(将数据存储在数据库中):

app.use(session({
  resave: true,
  saveUninitialized: true,
  secret: process.env.SESSION_SECRET,
  cookie : {
    expires: false
  },
  store: new MongoStore({
    url: process.env.MONGODB_URI || process.env.MONGOLAB_URI,
    autoReconnect: true
  })
}));
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

然后一切都像魅力一样(除了我有其他一些问题,这就是我切换到cookieSession.

谢谢!