diff --git a/src/core/lib/JWT.mjs b/src/core/lib/JWT.mjs index fee7fec5..57a82d21 100644 --- a/src/core/lib/JWT.mjs +++ b/src/core/lib/JWT.mjs @@ -19,6 +19,5 @@ export const JWT_ALGORITHMS = [ "RS512", "ES256", "ES384", - "ES512", - "None" + "ES512" ]; diff --git a/src/core/operations/JWTSign.mjs b/src/core/operations/JWTSign.mjs index af46908e..813b8b26 100644 --- a/src/core/operations/JWTSign.mjs +++ b/src/core/operations/JWTSign.mjs @@ -26,6 +26,7 @@ class JWTSign extends Operation { this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "JSON"; this.outputType = "string"; + const algorithmList = JWT_ALGORITHMS.concat(["None"]); this.args = [ { name: "Private/Secret Key", @@ -35,7 +36,7 @@ class JWTSign extends Operation { { name: "Signing algorithm", type: "option", - value: JWT_ALGORITHMS + value: algorithmList } ]; } diff --git a/src/core/operations/JWTVerify.mjs b/src/core/operations/JWTVerify.mjs index 604edc9c..fada2f56 100644 --- a/src/core/operations/JWTVerify.mjs +++ b/src/core/operations/JWTVerify.mjs @@ -26,12 +26,18 @@ class JWTVerify extends Operation { this.infoURL = "https://wikipedia.org/wiki/JSON_Web_Token"; this.inputType = "string"; this.outputType = "JSON"; + const algorithmList = JWT_ALGORITHMS.concat(["Any"]); this.args = [ { name: "Public/Secret Key", type: "text", value: "secret" }, + { + name: "Signing algorithm", + type: "option", + value: algorithmList + } ]; } @@ -41,10 +47,8 @@ class JWTVerify extends Operation { * @returns {string} */ run(input, args) { - const [key] = args; - const algos = JWT_ALGORITHMS; - algos[algos.indexOf("None")] = "none"; - + const [key, alg] = args; + const algos = (alg === "Any" ? JWT_ALGORITHMS : alg); try { const verified = jwt.verify(input, key, { algorithms: algos }); diff --git a/tests/operations/tests/JWTVerify.mjs b/tests/operations/tests/JWTVerify.mjs index 0a0817cc..48cee153 100644 --- a/tests/operations/tests/JWTVerify.mjs +++ b/tests/operations/tests/JWTVerify.mjs @@ -50,38 +50,77 @@ MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEVs/o5+uQbTjL3chynL4wXgUg2R9 q9UU8I5mEovUf86QZ7kOBIjJwqnzD1omageEHWwHdBO6B+dFabmdT9POxg== -----END PUBLIC KEY-----`; +const signedInputs = { + HS: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.0ha6-j4FwvEIKPVZ-hf3S_R9Hy_UtXzq4dnedXcUrXk", + RS: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.MjEJhtZk2nXzigi24piMzANmrj3mILHJcDl0xOjl5a8EgdKVL1oaMEjTkMQp5RA8YrqeRBFaX-BGGCKOXn5zPY1DJwWsBUyN9C-wGR2Qye0eogH_3b4M9EW00TPCUPXm2rx8URFj7Wg9VlsmrGzLV2oKkPgkVxuFSxnpO3yjn1Y", + ES: "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.WkECT51jSfpRkcpQ4x0h5Dwe7CFBI6u6Et2gWp91HC7mpN_qCFadRpsvJLtKubm6cJTLa68xtei0YrDD8fxIUA" +}; + TestRegister.addTests([ { name: "JWT Verify: HS", - input: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.0ha6-j4FwvEIKPVZ-hf3S_R9Hy_UtXzq4dnedXcUrXk", + input: signedInputs.HS, expectedOutput: outputObject, recipeConfig: [ { op: "JWT Verify", - args: [hsKey], + args: [hsKey, "HS256"], } - ], + ] + }, + { + name: "JWT Verify: Invalid HS", + input: signedInputs.HS, + expectedOutput: "JsonWebTokenError: invalid algorithm", + recipeConfig: [ + { + op: "JWT Verify", + args: [hsKey, "RS256"], + } + ] }, { name: "JWT Verify: RS", - input: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.MjEJhtZk2nXzigi24piMzANmrj3mILHJcDl0xOjl5a8EgdKVL1oaMEjTkMQp5RA8YrqeRBFaX-BGGCKOXn5zPY1DJwWsBUyN9C-wGR2Qye0eogH_3b4M9EW00TPCUPXm2rx8URFj7Wg9VlsmrGzLV2oKkPgkVxuFSxnpO3yjn1Y", + input: signedInputs.RS, expectedOutput: outputObject, recipeConfig: [ { op: "JWT Verify", - args: [rsPub], + args: [rsPub, "RS256"], } - ], + ] + }, + { + name: "JWT Verify: Invalid RS", + input: signedInputs.RS, + expectedOutput: "JsonWebTokenError: invalid algorithm", + recipeConfig: [ + { + op: "JWT Verify", + args: [rsPub, "ES256"], + } + ] }, { name: "JWT Verify: ES", - input: "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdHJpbmciOiJTb21lU3RyaW5nIiwiTnVtYmVyIjo0MiwiaWF0IjoxfQ.WkECT51jSfpRkcpQ4x0h5Dwe7CFBI6u6Et2gWp91HC7mpN_qCFadRpsvJLtKubm6cJTLa68xtei0YrDD8fxIUA", + input: signedInputs.ES, expectedOutput: outputObject, recipeConfig: [ { op: "JWT Verify", - args: [esPub], + args: [esPub, "ES256"], } - ], + ] + }, + { + name: "JWT Verify: Invalid ES", + input: signedInputs.ES, + expectedOutput: "JsonWebTokenError: invalid algorithm", + recipeConfig: [ + { + op: "JWT Verify", + args: [esPub, "HS256"], + } + ] } ]);