diff --git a/Framework/Backend/http/server.js b/Framework/Backend/http/server.js index 9d3df82b8..16a1c97c1 100644 --- a/Framework/Backend/http/server.js +++ b/Framework/Backend/http/server.js @@ -516,19 +516,10 @@ class HttpServer { } catch ({ name, message }) { this.logger.errorMessage(`${name} : ${message}`); - const response = { error: '403 - Json Web Token Error' }; - - // Allow for a custom message for known error messages - switch (message) { - case 'jwt must be provided': - response.message = 'You must provide a JWT token'; - break; - default: - response.message = 'Invalid JWT token provided'; - break; - } - - res.status(403).json(response); + res.status(403).json({ + error: '403 - Json Web Token Error', + message, + }); return; } diff --git a/Framework/Backend/services/O2TokenService.js b/Framework/Backend/services/O2TokenService.js index d0c359313..e2bcdfb93 100644 --- a/Framework/Backend/services/O2TokenService.js +++ b/Framework/Backend/services/O2TokenService.js @@ -56,7 +56,21 @@ class O2TokenService { * @throws {Error} - if token, secret or issuer are invalid */ verify(token) { - return jwt.verify(token, this._secret, { issuer: this._issuer }); + try { + return jwt.verify(token, this._secret, { issuer: this._issuer }); + } catch (error) { + switch (error.name) { + case 'TokenExpiredError': + error.message = `Token expired at ${error.expiredAt}`; + break; + case 'JsonWebTokenError': + error.message = `Invalid token: ${error.message}`; + break; + default: + error.message = `Token verification failed: ${error.message}`; + } + throw new jwt.JsonWebTokenError(error.message); + } } } diff --git a/Framework/Backend/test/mocha-http.js b/Framework/Backend/test/mocha-http.js index 4c2e36ab5..859080466 100644 --- a/Framework/Backend/test/mocha-http.js +++ b/Framework/Backend/test/mocha-http.js @@ -139,7 +139,7 @@ describe('REST API', () => { .expect('Content-Type', /json/) .expect(403, { error: '403 - Json Web Token Error', - message: 'Invalid JWT token provided', + message: 'Invalid token: jwt malformed', }, done); }); @@ -149,7 +149,7 @@ describe('REST API', () => { .expect('Content-Type', /json/) .expect(403, { error: '403 - Json Web Token Error', - message: 'You must provide a JWT token', + message: 'Invalid token: jwt must be provided', }, done); }); diff --git a/Framework/Backend/test/mocha-o2web-token.js b/Framework/Backend/test/mocha-o2web-token.js index ae6d35b96..1a3c4c0d8 100644 --- a/Framework/Backend/test/mocha-o2web-token.js +++ b/Framework/Backend/test/mocha-o2web-token.js @@ -80,7 +80,7 @@ describe('JSON Web Token', () => { const o2Token = new O2TokenService(jwt); const token = o2Token.generateToken(101, 'alice', 'Alice O2'); o2Token._secret = 'changed'; - assert.throws(() => o2Token.verify(token), new JsonWebTokenError('invalid signature')); + assert.throws(() => o2Token.verify(token), new JsonWebTokenError('Invalid token: invalid signature')); }); }); }); diff --git a/Framework/package-lock.json b/Framework/package-lock.json index 89dbe8014..0418cd755 100644 --- a/Framework/package-lock.json +++ b/Framework/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "express": "^4.22.1", "helmet": "^8.1.0", - "jsonwebtoken": "^9.0.0", + "jsonwebtoken": "9.0.3", "kafkajs": "^2.2.0", "mithril": "1.1.7", "mysql": "^2.18.1", @@ -3657,14 +3657,21 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -3672,9 +3679,9 @@ } }, "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -3683,12 +3690,12 @@ } }, "node_modules/jws": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", - "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", "license": "MIT", "dependencies": { - "jwa": "^1.4.2", + "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, @@ -3749,12 +3756,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -3767,6 +3768,48 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", diff --git a/Framework/package.json b/Framework/package.json index 2a36319d3..60bf1cae9 100644 --- a/Framework/package.json +++ b/Framework/package.json @@ -33,7 +33,7 @@ "dependencies": { "express": "^4.22.1", "helmet": "^8.1.0", - "jsonwebtoken": "^9.0.0", + "jsonwebtoken": "9.0.3", "kafkajs": "^2.2.0", "mithril": "1.1.7", "mysql": "^2.18.1",