diff --git a/spec/unit/oidc/validate.spec.ts b/spec/unit/oidc/validate.spec.ts index c9207e28fa4..bfb40a15b5f 100644 --- a/spec/unit/oidc/validate.spec.ts +++ b/spec/unit/oidc/validate.spec.ts @@ -170,6 +170,23 @@ describe("validateIdToken()", () => { expect(logger.error).toHaveBeenCalledWith("Invalid ID token", new Error("Invalid audience")); }); + it("should not throw when audience is an array that includes clientId", () => { + mocked(jwtDecode).mockReturnValue({ + ...validDecodedIdToken, + aud: [clientId], + }); + expect(() => validateIdToken(idToken, issuer, clientId, nonce)).not.toThrow(); + }); + + it("should throw when audience is an array that does not include clientId", () => { + mocked(jwtDecode).mockReturnValue({ + ...validDecodedIdToken, + aud: [`${clientId},uiop`, "asdf"], + }); + expect(() => validateIdToken(idToken, issuer, clientId, nonce)).toThrow(new Error(OidcError.InvalidIdToken)); + expect(logger.error).toHaveBeenCalledWith("Invalid ID token", new Error("Invalid audience")); + }); + it("should throw when nonce does not match", () => { mocked(jwtDecode).mockReturnValue({ ...validDecodedIdToken, diff --git a/src/oidc/validate.ts b/src/oidc/validate.ts index 72eb7e96e64..ce62e90eb6c 100644 --- a/src/oidc/validate.ts +++ b/src/oidc/validate.ts @@ -179,7 +179,8 @@ export const validateIdToken = ( * The ID Token MUST be rejected if the ID Token does not list the Client as a valid audience, or if it contains additional audiences not trusted by the Client. * EW: Don't accept tokens with other untrusted audiences * */ - if (claims.aud !== clientId) { + const sanitisedAuds = typeof claims.aud === "string" ? [claims.aud] : claims.aud; + if (!sanitisedAuds.includes(clientId)) { throw new Error("Invalid audience"); }