[英]Testing authenticated routes with JWT fails using Mocha + supertest + passport
我正在嘗試在 Mocha 中測試經過身份驗證的路由,但在before
或beforeEach
鈎子中創建的用戶不會持續存在。
在test.js
const should = require('chai').should(),
mongoose = require('mongoose'),
request = require('supertest'),
app = require('../../../../server'),
agent = request.agent(app),
AdminUser = require('../../../models/AdminUser');
var credentials = {
username: 'admin',
password: 'password'
};
var admin = new AdminUser(credentials);
describe('authenticated routes', function() {
before(function (done) {
admin.save(function (err) {
if (err) done(err);
agent.post('/api/authenticate')
.send(credentials)
.end(function (err, res) {
if (err) done(err);
jwtToken = res.body.token;
done();
});
});
});
it('should get content with 200', function (done) {
agent.get('/api/content')
.set('Authorization', 'JWT ' + jwtToken)
.expect(200)
.end((err, res) => {
if (err) return done(err);
done();
});
});
after(function (done) {
AdminUser.remove().exec();
done();
})
});
我嘗試使用beforeEach
並在afterEach
中進行afterEach
, /api/authenticate
的初始帖子成功返回200
,收到令牌但嘗試使用令牌進行身份驗證時,它得到400
。 這是由於未找到AdminUser
。
在護照策略中,我有:
module.exports = function (passport) {
passport.use(new JwtStrategy(opts, function(jwtPayload, done) {
AdminUser.findOne({ username: jwtPayload.username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Bad token.' });
}
return done(null, user);
});
}));
};
無論我將用戶保存在哪里, AdminUser
始終為null
。 僅當我嵌套回調時才有效,但這會否定before
或beforeEach
的使用。
您需要將 Authorization 標頭與Bearer身份驗證方案一起使用:
.set('Authorization', 'Bearer ' + jwtToken)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.