修改后的passport-jwt

如何解决修改后的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.errorself.fail代码区域。

例如https://github.com/MeStrak/passport-jwt/blob/9ab3f2d8e99079160ff1a56fd30078c1ec337dee/lib/strategy.js#L118

            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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?