我在使用来自Express的'cookieSession'时,使用Supertest测试Express应用程序时出现问题。
当我使用Express中的session
时,一切正常,但cookieSession
无法正常使用PassportJS。
我正在使用PassportJS对用户进行身份验证,并将用户设置为请求对象(req.user)。因此/login
按预期工作,它返回正确的set-cookie
标头,但在下一个请求中,身份验证失败,这不会将req.user
属性设置为用户对象,甚至虽然它正确地反序列化/序列化用户
版本:
这是我初始化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
的原因。
谢谢!