使用 Mocha + supertest + passport 使用 JWT 测试经过身份验证的路由失败
Posted
技术标签:
【中文标题】使用 Mocha + supertest + passport 使用 JWT 测试经过身份验证的路由失败【英文标题】:Testing authenticated routes with JWT fails using Mocha + supertest + passport 【发布时间】:2017-01-29 10:41:45 【问题描述】:我正在尝试在 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
中进行清理,/api/authenticate
的初始帖子成功返回200
,收到了一个令牌,但是当尝试使用该令牌进行身份验证时,它得到一个@987654329 @。这是因为找不到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
时才有效。
【问题讨论】:
【参考方案1】:您需要将 Authorization 标头与 Bearer 身份验证方案一起使用:
.set('Authorization', 'Bearer ' + jwtToken)
【讨论】:
以上是关于使用 Mocha + supertest + passport 使用 JWT 测试经过身份验证的路由失败的主要内容,如果未能解决你的问题,请参考以下文章
在 Mocha 测试中使用 Superagent/Supertest 和 Express 应用程序
如何使用 supertest 和 agent 在 mocha 测试中发出经过身份验证的请求?
nodejs+mocha+supertest+chai进行测试(only demo)
使用 mocha 测试 express 服务器并使用异步初始化程序进行 supertest 调用请求两次