NodeJS jsonwebtoken 9.0.0 -获取错误:TypeError:无法重新定义属性:解码-尝试存根时

z9gpfhce  于 2023-01-12  发布在  Node.js
关注(0)|答案(1)|浏览(262)

因此npm audit刚刚发现jsonwebtoken存在安全漏洞。The solution将更新到版本9.0.0-我已经这样做了。
但是,我的摩卡测试现在没有通过。在beforeEach期间,我尝试使用sinon.stub来存根decode函数,现在抛出以下TypeError:
TypeError: Cannot redefine property: decode
每次之前:

const jwt = require('jsonwebtoken');

beforeEach(function () {
  this.sinon.stub(jwt, 'verify').returns({ email: 'email@email.com' });
  this.sinon.stub(jwt, 'decode').returns({ header: { alg: 'RS256', typ: 'JWT', kid: 'MOCKKID' } });
  this.sinon.stub(jwks, 'getKey').returns('some mock certificate');
  this.sinon.stub(T, 'expired');
});

我假设stub verify仍然有效,因为只有当我尝试stub decode时,才会在下一行抛出错误
是的,有一个post with similar question,但它已经有两年的历史了,公认的答案是“这个问题很快就会在未来的版本中得到解决”,所以已经没有什么意义了。

icnyk63a

icnyk63a1#

由于jsonwebtoken v9.0.0使decode函数不可枚举且不可配置,请参见v9.0.0/index.js#L9
index.js

module.exports = {
  verify: require('./verify'),
  sign: require('./sign'),
  JsonWebTokenError: require('./lib/JsonWebTokenError'),
  NotBeforeError: require('./lib/NotBeforeError'),
  TokenExpiredError: require('./lib/TokenExpiredError'),
};

Object.defineProperty(module.exports, 'decode', {
  enumerable: false,
  value: require('./decode'),
});

来自文档由Object. defineProperty创建的不可配置属性
Object.defineProperty()会创建不可配置的属性,如果您没有将它们指定为可配置的。
这意味着configurable: false是默认的,这就是sinon.stub(jwt, 'decode')不再工作的原因。
并且有PR试图修复它以允许decode函数被存根化。这个PR使得decode可配置:

Object.defineProperty(module.exports, 'decode', {
  enumerable: false,
  configurable: true,
  value: require('./decode'),
});

有一个临时的解决方案,你可以创建你自己的jwt utils模块和stub你自己的jwt utils。
例如
jwt-repack.js

const jwt = require('jsonwebtoken');
const decode = require('jsonwebtoken').decode;

module.exports = {
  ...jwt,
  decode
};

index.test.js

const sinon = require('sinon');
const jwt = require('./jwt-repack');

it('should pass', () => {
  sinon.stub(jwt, 'decode').returns({ header: { alg: 'RS256', typ: 'JWT', kid: 'MOCKKID' } });

  const actual = jwt.decode();
  sinon.assert.match(actual, { header: { alg: 'RS256', typ: 'JWT', kid: 'MOCKKID' } });
});

软件包版本:

"jsonwebtoken9": "npm:jsonwebtoken@^9.0.0",
"sinon": "^8.1.1",

相关问题