mirror of https://github.com/jwtk/jjwt.git
Added requireExpiration and requireNotBefore
This commit is contained in:
parent
ddda2f92d3
commit
2e452a42b1
|
@ -67,6 +67,22 @@ public interface JwtParser {
|
||||||
*/
|
*/
|
||||||
JwtParser requireIssuedAt(Date issuedAt);
|
JwtParser requireIssuedAt(Date issuedAt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an expected value for the expiration claim.
|
||||||
|
*
|
||||||
|
* @param expiration
|
||||||
|
* @return the parser for method chaining.
|
||||||
|
*/
|
||||||
|
JwtParser requireExpiration(Date expiration);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an expected value for the notBefore claim.
|
||||||
|
*
|
||||||
|
* @param notBefore
|
||||||
|
* @return the parser for method chaining
|
||||||
|
*/
|
||||||
|
JwtParser requireNotBefore(Date notBefore);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an expected value for any given claim name.
|
* Sets an expected value for any given claim name.
|
||||||
*
|
*
|
||||||
|
|
|
@ -99,6 +99,20 @@ public class DefaultJwtParser implements JwtParser {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JwtParser requireExpiration(Date expiration) {
|
||||||
|
expectedClaims.setExpiration(expiration);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JwtParser requireNotBefore(Date notBefore) {
|
||||||
|
expectedClaims.setNotBefore(notBefore);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JwtParser require(String claimName, Object value) {
|
public JwtParser require(String claimName, Object value) {
|
||||||
Assert.hasText(claimName, "claim name cannot be null or empty.");
|
Assert.hasText(claimName, "claim name cannot be null or empty.");
|
||||||
|
|
|
@ -1191,4 +1191,140 @@ class JwtParserTest {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseRequireExpiration_Success() {
|
||||||
|
// expire in the future
|
||||||
|
def expiration = new Date(System.currentTimeMillis() + 10000)
|
||||||
|
|
||||||
|
byte[] key = randomKey()
|
||||||
|
|
||||||
|
String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key).
|
||||||
|
setExpiration(expiration).
|
||||||
|
compact()
|
||||||
|
|
||||||
|
Jwt<Header,Claims> jwt = Jwts.parser().setSigningKey(key).
|
||||||
|
requireExpiration(expiration).
|
||||||
|
parseClaimsJws(compact)
|
||||||
|
|
||||||
|
// system converts to seconds (lopping off millis precision), then returns millis
|
||||||
|
def expirationMillis = ((long)expiration.getTime() / 1000) * 1000
|
||||||
|
|
||||||
|
assertEquals jwt.getBody().getExpiration().getTime(), expirationMillis
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseRequireExpirationAt_Incorrect_Fail() {
|
||||||
|
def goodExpiration = new Date(System.currentTimeMillis() + 20000)
|
||||||
|
def badExpiration = new Date(System.currentTimeMillis() + 10000)
|
||||||
|
|
||||||
|
byte[] key = randomKey()
|
||||||
|
|
||||||
|
String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key).
|
||||||
|
setExpiration(badExpiration).
|
||||||
|
compact()
|
||||||
|
|
||||||
|
try {
|
||||||
|
Jwts.parser().setSigningKey(key).
|
||||||
|
requireExpiration(goodExpiration).
|
||||||
|
parseClaimsJws(compact)
|
||||||
|
fail()
|
||||||
|
} catch(IncorrectClaimException e) {
|
||||||
|
assertEquals(
|
||||||
|
String.format(INCORRECT_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.EXPIRATION, goodExpiration, badExpiration),
|
||||||
|
e.getMessage()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseRequireExpiration_Missing_Fail() {
|
||||||
|
def expiration = new Date(System.currentTimeMillis() + 10000)
|
||||||
|
|
||||||
|
byte[] key = randomKey()
|
||||||
|
|
||||||
|
String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key).
|
||||||
|
setSubject("Dummy").
|
||||||
|
compact()
|
||||||
|
|
||||||
|
try {
|
||||||
|
Jwts.parser().setSigningKey(key).
|
||||||
|
requireExpiration(expiration).
|
||||||
|
parseClaimsJws(compact)
|
||||||
|
fail()
|
||||||
|
} catch(MissingClaimException e) {
|
||||||
|
assertEquals(
|
||||||
|
String.format(MISSING_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.EXPIRATION, expiration),
|
||||||
|
e.getMessage()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseRequireNotBefore_Success() {
|
||||||
|
// expire in the future
|
||||||
|
def notBefore = new Date(System.currentTimeMillis() - 10000)
|
||||||
|
|
||||||
|
byte[] key = randomKey()
|
||||||
|
|
||||||
|
String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key).
|
||||||
|
setNotBefore(notBefore).
|
||||||
|
compact()
|
||||||
|
|
||||||
|
Jwt<Header,Claims> jwt = Jwts.parser().setSigningKey(key).
|
||||||
|
requireNotBefore(notBefore).
|
||||||
|
parseClaimsJws(compact)
|
||||||
|
|
||||||
|
// system converts to seconds (lopping off millis precision), then returns millis
|
||||||
|
def notBeforeMillis = ((long)notBefore.getTime() / 1000) * 1000
|
||||||
|
|
||||||
|
assertEquals jwt.getBody().getNotBefore().getTime(), notBeforeMillis
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseRequireNotBefore_Incorrect_Fail() {
|
||||||
|
def goodNotBefore = new Date(System.currentTimeMillis() - 20000)
|
||||||
|
def badNotBefore = new Date(System.currentTimeMillis() - 10000)
|
||||||
|
|
||||||
|
byte[] key = randomKey()
|
||||||
|
|
||||||
|
String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key).
|
||||||
|
setNotBefore(badNotBefore).
|
||||||
|
compact()
|
||||||
|
|
||||||
|
try {
|
||||||
|
Jwts.parser().setSigningKey(key).
|
||||||
|
requireNotBefore(goodNotBefore).
|
||||||
|
parseClaimsJws(compact)
|
||||||
|
fail()
|
||||||
|
} catch(IncorrectClaimException e) {
|
||||||
|
assertEquals(
|
||||||
|
String.format(INCORRECT_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.NOT_BEFORE, goodNotBefore, badNotBefore),
|
||||||
|
e.getMessage()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseRequireNotBefore_Missing_Fail() {
|
||||||
|
def notBefore = new Date(System.currentTimeMillis() - 10000)
|
||||||
|
|
||||||
|
byte[] key = randomKey()
|
||||||
|
|
||||||
|
String compact = Jwts.builder().signWith(SignatureAlgorithm.HS256, key).
|
||||||
|
setSubject("Dummy").
|
||||||
|
compact()
|
||||||
|
|
||||||
|
try {
|
||||||
|
Jwts.parser().setSigningKey(key).
|
||||||
|
requireNotBefore(notBefore).
|
||||||
|
parseClaimsJws(compact)
|
||||||
|
fail()
|
||||||
|
} catch(MissingClaimException e) {
|
||||||
|
assertEquals(
|
||||||
|
String.format(MISSING_EXPECTED_CLAIM_MESSAGE_TEMPLATE, Claims.NOT_BEFORE, notBefore),
|
||||||
|
e.getMessage()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue