diff --git a/src/main/java/io/jsonwebtoken/JwtParser.java b/src/main/java/io/jsonwebtoken/JwtParser.java index f9c2e54e8..9f6906c71 100644 --- a/src/main/java/io/jsonwebtoken/JwtParser.java +++ b/src/main/java/io/jsonwebtoken/JwtParser.java @@ -27,6 +27,14 @@ public interface JwtParser { public static final char SEPARATOR_CHAR = '.'; + /** + * Sets an expected value for the audience claim. + * + * @param audience + * @return the parser for method chaining. + */ + JwtParser expectAudience(String audience); + /** * Sets an expected value for the issuer claim. * diff --git a/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java b/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java index be898304a..08664d09c 100644 --- a/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java +++ b/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java @@ -80,6 +80,13 @@ public JwtParser expectIssuer(String issuer) { return this; } + @Override + public JwtParser expectAudience(String audience) { + expect(Claims.AUDIENCE, audience); + + return this; + } + @Override public JwtParser expect(String claimName, Object value) { if (claimName != null && claimName.length() > 0 && value != null) { diff --git a/src/test/groovy/io/jsonwebtoken/JwtParserTest.groovy b/src/test/groovy/io/jsonwebtoken/JwtParserTest.groovy index da3dbb21b..7cd1d88da 100644 --- a/src/test/groovy/io/jsonwebtoken/JwtParserTest.groovy +++ b/src/test/groovy/io/jsonwebtoken/JwtParserTest.groovy @@ -981,4 +981,69 @@ class JwtParserTest { ) } } + + @Test + void testParseExpectAudience_Success() { + def audience = 'A Most Awesome Audience' + + byte[] key = randomKey() + + String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key). + setAudience(audience). + compact() + + Jwt jwt = Jwts.parser().setSigningKey(key). + expectAudience(audience). + parseClaimsJws(compact) + + assertEquals jwt.getBody().getAudience(), audience + } + + @Test + void testParseExpectAudience_Incorrect_Fail() { + def goodAudience = 'A Most Awesome Audience' + def badAudience = 'A Most Bogus Audience' + + byte[] key = randomKey() + + String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key). + setAudience(badAudience). + compact() + + try { + Jwts.parser().setSigningKey(key). + expectAudience(goodAudience). + parseClaimsJws(compact) + fail() + } catch(IncorrectClaimException e) { + assertEquals( + String.format(INCORRECT_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.AUDIENCE, goodAudience, badAudience), + e.getMessage() + ) + } + } + + @Test + void testParseExpectAudience_Missing_Fail() { + def audience = 'A Most Awesome audience' + + byte[] key = randomKey() + + String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key). + setId('id'). + compact() + + try { + Jwts.parser().setSigningKey(key). + expectAudience(audience). + parseClaimsJws(compact) + fail() + } catch(MissingClaimException e) { + assertEquals( + String.format(MISSING_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.AUDIENCE, audience), + e.getMessage() + ) + } + } + }