Skip to content

Commit 2532d11

Browse files
committed
[major] bump jose
1 parent 23a0350 commit 2532d11

File tree

8 files changed

+65
-23
lines changed

8 files changed

+65
-23
lines changed

.circleci/config.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
parameters:
99
node-version:
1010
type: string
11-
default: "12"
11+
default: "18"
1212
docker:
1313
- image: circleci/node:<< parameters.node-version >>
1414
environment:
@@ -37,7 +37,7 @@ workflows:
3737
- build:
3838
matrix:
3939
parameters:
40-
node-version: ["10", "12", "14"]
40+
node-version: ["14", "16", "18"]
4141
- ship/node-publish:
4242
requires:
4343
- build

package-lock.json

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

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"@types/express": "^4.17.14",
1616
"@types/jsonwebtoken": "^8.5.9",
1717
"debug": "^4.3.4",
18-
"jose": "^2.0.6",
18+
"jose": "^4.10.3",
1919
"limiter": "^1.1.5",
2020
"lru-memoizer": "^2.1.4"
2121
},
@@ -32,6 +32,7 @@
3232
"express-jwt": "^6.0.0",
3333
"express-jwt-v7": "npm:express-jwt@^7.5.0",
3434
"jsonwebtoken": "^8.5.1",
35+
"jose2": "npm:jose@^2.0.6",
3536
"koa": "^2.12.1",
3637
"koa-jwt": "^3.6.0",
3738
"mocha": "^6.2.3",

src/JwksClient.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class JwksClient {
5656
throw new JwksError('The JWKS endpoint did not contain any keys');
5757
}
5858

59-
const signingKeys = retrieveSigningKeys(keys);
59+
const signingKeys = await retrieveSigningKeys(keys);
6060

6161
if (!signingKeys.length) {
6262
throw new JwksError('The JWKS endpoint did not contain any signing keys');

src/integrations/passport.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const JWT = require('jose').JWT;
1+
const jose = require('jose');
22
const { ArgumentError } = require('../errors');
33
const { JwksClient } = require('../JwksClient');
44
const supportedAlg = require('./config');
@@ -30,7 +30,10 @@ module.exports.passportJwtSecret = function (options) {
3030
return function secretProvider(req, rawJwtToken, cb) {
3131
let decoded;
3232
try {
33-
decoded = JWT.decode(rawJwtToken, { complete: true });
33+
decoded = {
34+
payload: jose.decodeJwt(rawJwtToken),
35+
header: jose.decodeProtectedHeader(rawJwtToken)
36+
};
3437
} catch (err) {
3538
decoded = null;
3639
}

src/utils.js

+30-11
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
11
const jose = require('jose');
2+
const crypto = require('crypto');
23

3-
function retrieveSigningKeys(keys) {
4-
const keystore = jose.JWKS.asKeyStore({ keys }, { ignoreErrors: true });
4+
async function retrieveSigningKeys(jwks) {
5+
const results = [];
56

6-
return keystore.all({ use: 'sig' }).map((key) => {
7-
return {
8-
kid: key.kid,
9-
alg: key.alg,
10-
get publicKey() { return key.toPEM(false); },
11-
get rsaPublicKey() { return key.toPEM(false); },
12-
getPublicKey() { return key.toPEM(false); }
13-
};
14-
});
7+
jwks = jwks
8+
.filter(({ use }) => use === 'sig' || use === undefined)
9+
.filter(({ kty }) => kty === 'RSA' || kty === 'EC' || kty === 'OKP');
10+
11+
for (const jwk of jwks) {
12+
try {
13+
// The algorithm is actually not used in the Node.js KeyObject-based runtime
14+
// passing an arbitrary value here and checking that KeyObject was returned
15+
// later
16+
const keyObject = await jose.importJWK(jwk, 'RS256');
17+
if (!(keyObject instanceof crypto.KeyObject) || keyObject.type !== 'public') {
18+
continue;
19+
}
20+
const getSpki = () => keyObject.export({ format: 'pem', type: 'spki' });
21+
results.push({
22+
get publicKey() { return getSpki(); },
23+
get rsaPublicKey() { return getSpki(); },
24+
getPublicKey() { return getSpki(); },
25+
...(typeof jwk.kid === 'string' && jwk.kid ? { kid: jwk.kid } : undefined),
26+
...(typeof jwk.alg === 'string' && jwk.alg ? { alg: jwk.alg } : undefined)
27+
});
28+
} catch (err) {
29+
continue;
30+
}
31+
}
32+
33+
return results;
1534
}
1635

1736
module.exports = {

src/wrappers/interceptor.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function getKeysInterceptor(client, { getKeysInterceptor }) {
1212

1313
let signingKeys;
1414
if (keys && keys.length) {
15-
signingKeys = retrieveSigningKeys(keys);
15+
signingKeys = await retrieveSigningKeys(keys);
1616
}
1717

1818
if (signingKeys && signingKeys.length) {

tests/mocks/jwks.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
const nock = require('nock');
2-
const jose = require('jose');
2+
const jose2 = require('jose2');
33

44
function jwksEndpoint(host, certs) {
55
return nock(host)
66
.get('/.well-known/jwks.json')
77
.reply(200, {
88
keys: certs.map(cert => {
9-
const parsed = jose.JWK.asKey(cert.pub).toJWK();
9+
const parsed = jose2.JWK.asKey(cert.pub).toJWK();
1010
return {
1111
...parsed,
1212
use: 'sig',

0 commit comments

Comments
 (0)