From f3c8f10f32d89a447ead2311536a5de90b5a02eb Mon Sep 17 00:00:00 2001 From: Micah Silverman Date: Sat, 12 Sep 2015 03:40:20 -0400 Subject: [PATCH] Added expectSubject convenience method. --- src/main/java/io/jsonwebtoken/JwtParser.java | 8 +++ .../jsonwebtoken/impl/DefaultJwtParser.java | 7 +++ .../io/jsonwebtoken/JwtParserTest.groovy | 63 +++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/src/main/java/io/jsonwebtoken/JwtParser.java b/src/main/java/io/jsonwebtoken/JwtParser.java index 9f6906c7..c74ec9e6 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 subject claim. + * + * @param subject + * @return the parser for method chaining. + */ + JwtParser expectSubject(String subject); + /** * Sets an expected value for the audience claim. * diff --git a/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java b/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java index 08664d09..a251ca8e 100644 --- a/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java +++ b/src/main/java/io/jsonwebtoken/impl/DefaultJwtParser.java @@ -87,6 +87,13 @@ public class DefaultJwtParser implements JwtParser { return this; } + @Override + public JwtParser expectSubject(String subject) { + expect(Claims.SUBJECT, subject); + + 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 7cd1d88d..c6116842 100644 --- a/src/test/groovy/io/jsonwebtoken/JwtParserTest.groovy +++ b/src/test/groovy/io/jsonwebtoken/JwtParserTest.groovy @@ -1046,4 +1046,67 @@ class JwtParserTest { } } + @Test + void testParseExpectSubject_Success() { + def subject = 'A Most Awesome Subject' + + byte[] key = randomKey() + + String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key). + setSubject(subject). + compact() + + Jwt jwt = Jwts.parser().setSigningKey(key). + expectSubject(subject). + parseClaimsJws(compact) + + assertEquals jwt.getBody().getSubject(), subject + } + + @Test + void testParseExpectSubject_Incorrect_Fail() { + def goodSubject = 'A Most Awesome Subject' + def badSubject = 'A Most Bogus Subject' + + byte[] key = randomKey() + + String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key). + setSubject(badSubject). + compact() + + try { + Jwts.parser().setSigningKey(key). + expectSubject(goodSubject). + parseClaimsJws(compact) + fail() + } catch(IncorrectClaimException e) { + assertEquals( + String.format(INCORRECT_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.SUBJECT, goodSubject, badSubject), + e.getMessage() + ) + } + } + + @Test + void testParseExpectSubject_Missing_Fail() { + def subject = 'A Most Awesome Subject' + + byte[] key = randomKey() + + String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key). + setId('id'). + compact() + + try { + Jwts.parser().setSigningKey(key). + expectSubject(subject). + parseClaimsJws(compact) + fail() + } catch(MissingClaimException e) { + assertEquals( + String.format(MISSING_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.SUBJECT, subject), + e.getMessage() + ) + } + } }