如何解决修改后的passport-jwt
我目前正在开发一个分叉的passport-jwt,它在一个数组中接受多个jwks提供者。
它实际上运行良好,但我在自动化测试方面遇到了问题,使用现有的 Passport-jwt 测试,因为它应该完全向后兼容。
我的存储库在这里:https://github.com/MeStrak/passport-jwt/tree/9ab3f2d8e99079160ff1a56fd30078c1ec337dee(链接是当前存储库版本以供将来参考,因为我仍在重构新代码的某些部分)。
与passport-jwt相比的基本实现变化是:
- 构造函数接受一个配置数组,并将它们放入一个 _config 数组中,而不是直接在 self 上存储单个配置
- authenticate 函数实现
async.each()
以并行处理所有配置,如果有则立即返回成功,或者在处理结束时返回所有错误/失败。
现在运行 npm test
时,我有 54 次通过,3 次失败。所有失败都具有相同的性质,如下例所示:
handling failing jwt
(node:9620) UnhandledPromiseRejectionWarning: Error: Strategy#error should not be called
at JwtStrategy.strategy.error (/workspace/passport-jwt/node_modules/chai-passport-strategy/lib/test.js:124:33)
at /workspace/passport-jwt/lib/strategy.js:131:30
最后是这个输出:
1) Strategy
handling failing jwt
"before all" hook for "should not call verify":
Error: Timeout of 2000ms exceeded. For async tests and hooks,ensure "done()" is called; if returning a Promise,ensure it resolves. (/workspace/passport-jwt/test/strategy-validation-test.js)
at listOnTimeout (internal/timers.js:554:17)
at processtimers (internal/timers.js:497:7)
抛出该错误的测试在未修改的代码上通过得很好,所以问题肯定与我的实现有关:
describe('handling failing jwt',function() {
var strategy,info;
var verify_spy = sinon.spy();
before(function(done) {
strategy = new Strategy({jwtFromrequest: extract_jwt.fromAuthHeaderAsBearerToken(),secretorKey: 'secret'},verify_spy);
// Mock errored verification
Strategy.JwtVerifier = sinon.stub();
Strategy.JwtVerifier.callsArgWith(3,new Error("jwt expired"),false);
chai.passport.use(strategy)
.fail(function(i) {
info = i;
done();
})
.req(function(req) {
req.headers['authorization'] = "bearer " + test_data.valid_jwt.token;
})
.authenticate();
});
it('should not call verify',function() {
sinon.assert.notCalled(verify_spy);
});
it('should fail with error message.',function() {
expect(info).to.be.an.object;
expect(info.message).to.equal('jwt expired');
});
});
问题出在直接调用 self.error
或 self.fail
的代码区域。
if (secretorKeyError) {
errors.push(secretorKeyError)
if (fails.length + errors.length == self._config.length) {
if (self._config.length == 1) {
errors.length > 0 ? self.error(errors[0]) : self.fail(fails[0]);
}
const allErrors = errors.concat(fails);
if (errors.length > 0) {
self.error(allErrors);
}
else {
self.fail(allErrors);
}
}
但是在调用_verify的代码部分(https://github.com/MeStrak/passport-jwt/blob/9ab3f2d8e99079160ff1a56fd30078c1ec337dee/lib/strategy.js#L186),没有出现同样的错误。
现在的问题是我不知道要查找什么或如何进一步调试。我认为我所做的更改将向后兼容,因此所有测试用例都应该通过,但我想 async.each 的行为有些我不完全理解。
任何提示将不胜感激!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。