Skip to content

Commit d65d594

Browse files
authoredOct 8, 2021
Merge pull request #268 from auth0/no-cache-errors
[SDK-2833] Fix issue where errors were being cached
2 parents bc05ccc + 33bf651 commit d65d594

File tree

4 files changed

+43
-9
lines changed

4 files changed

+43
-9
lines changed
 

‎package-lock.json

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@types/nock": "^11.0.0",
2525
"@types/node": "^14.14.12",
2626
"chai": "^3.5.0",
27+
"chai-as-promised": "^7.1.1",
2728
"eslint": "^5.16.0",
2829
"express": "^4.17.1",
2930
"express-jwt": "^6.0.0",

‎src/wrappers/cache.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
const logger = require('debug')('jwks');
22
const memoizer = require('lru-memoizer');
3+
const { promisify, callbackify } = require('util');
34

45
function cacheWrapper(client, { cacheMaxEntries = 5, cacheMaxAge = 600000 }) {
56
logger(`Configured caching of signing keys. Max: ${cacheMaxEntries} / Age: ${cacheMaxAge}`);
6-
return memoizer.sync({
7+
return promisify(memoizer({
78
hash: (kid) => kid,
8-
load: client.getSigningKey.bind(client),
9+
load: callbackify(client.getSigningKey.bind(client)),
910
maxAge: cacheMaxAge,
1011
max: cacheMaxEntries
11-
});
12+
}));
1213
}
1314

1415
module.exports.default = cacheWrapper;

‎tests/jwksClient.tests.js

+23-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const nock = require('nock');
2-
const { expect } = require('chai');
2+
const { expect } = require('chai').use(require('chai-as-promised'));
33

44
const { x5cMultiple } = require('./keys');
55
const { JwksClient } = require('../src/JwksClient');
@@ -361,13 +361,13 @@ describe('JwksClient', () => {
361361
expect(err.name).to.equal('JwksError');
362362
expect(err.message).to.equal(
363363
'The JWKS endpoint did not contain any signing keys'
364-
);
364+
);
365365
}
366366
});
367367

368368
it('should handle errors passed from the interceptor', async () => {
369369
const error = new Error('interceptor error');
370-
const client = new JwksClient({
370+
const client = new JwksClient({
371371
jwksUri: 'http://invalidUri',
372372
getKeysInterceptor: () => { throw error; }
373373
});
@@ -388,7 +388,7 @@ describe('JwksClient', () => {
388388
nock(jwksHost)
389389
.get('/.well-known/jwks.json')
390390
.reply(200, x5cMultiple);
391-
391+
392392
const client = new JwksClient({
393393
jwksUri: `${jwksHost}/.well-known/jwks.json`
394394
});
@@ -404,11 +404,11 @@ describe('JwksClient', () => {
404404
nock(jwksHost)
405405
.get('/.well-known/jwks.json')
406406
.reply(200, x5cMultiple);
407-
407+
408408
const client = new JwksClient({
409409
jwksUri: `${jwksHost}/.well-known/jwks.json`
410410
});
411-
411+
412412
client.getSigningKey('123', (err) => {
413413
expect(err).not.to.be.null;
414414
expect(err.name).to.equal('SigningKeyNotFoundError');
@@ -454,5 +454,22 @@ describe('JwksClient', () => {
454454
expect(err.message).to.equal('Http Error 500');
455455
}
456456
});
457+
458+
it('should not cache errors', async () => {
459+
nock(jwksHost)
460+
.get('/.well-known/jwks.json')
461+
.reply(500);
462+
nock(jwksHost)
463+
.get('/.well-known/jwks.json')
464+
.reply(200, x5cMultiple);
465+
466+
const client = new JwksClient({
467+
jwksUri: `${jwksHost}/.well-known/jwks.json`
468+
});
469+
470+
const kid = x5cMultiple.keys[0].kid;
471+
await expect(client.getSigningKey(kid)).to.eventually.be.rejectedWith('Http Error 500');
472+
await expect(client.getSigningKey(kid)).to.eventually.have.property('kid', kid);
473+
});
457474
});
458475
});

0 commit comments

Comments
 (0)