我有一个明确的应用程序,由JWT处理身份验证,我只是在登录后将令牌存储在会话中。
req.session.JWToken = '<token>';
身份验证中间件如下所示:
this.use('(^\/admin')', expressJWT({
secret: 'secret',
getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
} else if (req.session.JWToken) {
return req.session.JWToken;
}
return null;
}
}).unless({path: ['/login', '/signup']}));
我需要使用mocha和supertest测试这个,我尝试了下面的代码:
var app = require('./../app');
var request = require('supertest');
describe('app', function() {
var agent = request.agent(app);
it('should signin', function(done) {
agent
.post('/login')
.send({_email: '<email>', _password: '<password>'})
.expect(200, done)
.end(function(err, res){
if(err) throw err;
done();
});
});
// how to persist session here ?
it('should get a restricted page', function(done) {
agent
.get('/admin')
.expect(200)
.end(function(err, res){
if(err) throw err;
done();
});
});
});
不知道如何在第二个it
上坚持会议。请指导我。
答案 0 :(得分:2)
昨天我遇到了同样的问题并且弄清楚了。尝试在ParseInstallation.getCurrentInstallation()
区块之外设置agent
:
describe
如果这不起作用,请尝试使用sinon在beforeEach循环中执行登录POST。
var app = require('./../app');
var request = require('supertest');
var agent = request.agent(app);
describe('app', function() {
it('should signin', function(done) {
agent
.post('/login')
.send({_email: '<email>', _password: '<password>'})
.expect(200, done)
.end(function(err, res){
if(err) throw err;
done();
});
});
// how to persist session here ?
it('should get a restricted page', function(done) {
agent
.get('/admin')
.expect(200)
.end(function(err, res){
if(err) throw err;
done();
});
});
});
如果这不起作用,请尝试确保您的beforeEach((done) => {
agent
.post('/login')
.send({_email: '<email>', _password: '<password>'})
.end((err, res) => {
if (err) throw err;
done();
});
});
和email
参数正确无误。