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

时间:2018-05-14 20:22:08

标签: node.js express passport.js supertest

我在使用来自Express的'cookieSession'时,使用Supertest测试Express应用程序时出现问题。 当我使用Express中的session时,一切正常,但cookieSession无法正常使用PassportJS。

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

环境

版本:

  • Express:4.16.2
  • PassportJS:0.3.2
  • Supertest:2.0.1
  • Superagent:2.3.0

这是我初始化superagent的方式:

import * as supertest from 'supertest';
import * as superagent from 'superagent';
import app from '../../app';
const request = supertest.agent(app);

我在测试之前运行登录(使用async / await功能):

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

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

const readResponse: superagent.Response = await             
request.post('/getData').send(requestBody);

这就是失败的地方。它返回状态码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());

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

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());

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

谢谢!

0 个答案:

没有答案