Skip to content

Commit 716873a

Browse files
committed
Added leeway for date validation issue #54
1 parent c5e4b5d commit 716873a

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

Sources/ClaimSet.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,18 @@ extension ClaimSet {
9393
// MARK: Validations
9494

9595
extension ClaimSet {
96-
public func validate(audience: String? = nil, issuer: String? = nil) throws {
96+
public func validate(audience: String? = nil, issuer: String? = nil, leeway: TimeInterval = 0) throws {
9797
if let issuer = issuer {
9898
try validateIssuer(issuer)
9999
}
100100

101101
if let audience = audience {
102102
try validateAudience(audience)
103103
}
104-
105-
try validateExpiary()
106-
try validateNotBefore()
107-
try validateIssuedAt()
104+
105+
try validateExpiary(leeway: leeway)
106+
try validateNotBefore(leeway: leeway)
107+
try validateIssuedAt(leeway: leeway)
108108
}
109109

110110
public func validateAudience(_ audience: String) throws {
@@ -131,16 +131,16 @@ extension ClaimSet {
131131
}
132132
}
133133

134-
public func validateExpiary() throws {
135-
try validateDate(claims, key: "exp", comparison: .orderedAscending, failure: .expiredSignature, decodeError: "Expiration time claim (exp) must be an integer")
134+
public func validateExpiary(leeway: TimeInterval = 0) throws {
135+
try validateDate(claims, key: "exp", comparison: .orderedAscending, leeway: (-1 * leeway), failure: .expiredSignature, decodeError: "Expiration time claim (exp) must be an integer")
136136
}
137137

138-
public func validateNotBefore() throws {
139-
try validateDate(claims, key: "nbf", comparison: .orderedDescending, failure: .immatureSignature, decodeError: "Not before claim (nbf) must be an integer")
138+
public func validateNotBefore(leeway: TimeInterval = 0) throws {
139+
try validateDate(claims, key: "nbf", comparison: .orderedDescending, leeway: leeway, failure: .immatureSignature, decodeError: "Not before claim (nbf) must be an integer")
140140
}
141141

142-
public func validateIssuedAt() throws {
143-
try validateDate(claims, key: "iat", comparison: .orderedDescending, failure: .invalidIssuedAt, decodeError: "Issued at claim (iat) must be an integer")
142+
public func validateIssuedAt(leeway: TimeInterval = 0) throws {
143+
try validateDate(claims, key: "iat", comparison: .orderedDescending, leeway: leeway, failure: .invalidIssuedAt, decodeError: "Issued at claim (iat) must be an integer")
144144
}
145145
}
146146

Sources/Claims.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import Foundation
22

3-
func validateDate(_ payload: Payload, key: String, comparison: ComparisonResult, failure: InvalidToken, decodeError: String) throws {
3+
func validateDate(_ payload: Payload, key: String, comparison: ComparisonResult, leeway: TimeInterval = 0, failure: InvalidToken, decodeError: String) throws {
44
if payload[key] == nil {
55
return
66
}
77

88
guard let date = extractDate(payload: payload, key: key) else {
99
throw InvalidToken.decodeError(decodeError)
1010
}
11-
12-
if date.compare(Date()) == comparison {
11+
12+
if date.compare(Date().addingTimeInterval(leeway)) == comparison {
1313
throw failure
1414
}
1515
}

Sources/Decode.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,20 @@ public enum InvalidToken: CustomStringConvertible, Error {
4747

4848

4949
/// Decode a JWT
50-
public func decode(_ jwt: String, algorithms: [Algorithm], verify: Bool = true, audience: String? = nil, issuer: String? = nil) throws -> ClaimSet {
50+
public func decode(_ jwt: String, algorithms: [Algorithm], verify: Bool = true, audience: String? = nil, issuer: String? = nil, leeway: TimeInterval = 0) throws -> ClaimSet {
5151
let (header, claims, signature, signatureInput) = try load(jwt)
5252

5353
if verify {
54-
try claims.validate(audience: audience, issuer: issuer)
54+
try claims.validate(audience: audience, issuer: issuer, leeway: leeway)
5555
try verifySignature(algorithms, header: header, signingInput: signatureInput, signature: signature)
5656
}
5757

5858
return claims
5959
}
6060

6161
/// Decode a JWT
62-
public func decode(_ jwt: String, algorithm: Algorithm, verify: Bool = true, audience: String? = nil, issuer: String? = nil) throws -> ClaimSet {
63-
return try decode(jwt, algorithms: [algorithm], verify: verify, audience: audience, issuer: issuer)
62+
public func decode(_ jwt: String, algorithm: Algorithm, verify: Bool = true, audience: String? = nil, issuer: String? = nil, leeway: TimeInterval = 0) throws -> ClaimSet {
63+
return try decode(jwt, algorithms: [algorithm], verify: verify, audience: audience, issuer: issuer, leeway: leeway)
6464
}
6565

6666
/// Decode a JWT

0 commit comments

Comments
 (0)