Skip to content

Commit a6574d5

Browse files
committed
refactor: Make internal validators throwing
1 parent 1e3d591 commit a6574d5

File tree

2 files changed

+22
-28
lines changed

2 files changed

+22
-28
lines changed

Sources/Claims.swift

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,48 @@
11
import Foundation
22

3-
func validateClaims(_ payload:Payload, audience:String?, issuer:String?) -> InvalidToken? {
4-
return validateIssuer(payload, issuer: issuer) ?? validateAudience(payload, audience: audience) ??
5-
validateDate(payload, key: "exp", comparison: .orderedAscending, failure: .expiredSignature, decodeError: "Expiration time claim (exp) must be an integer") ??
6-
validateDate(payload, key: "nbf", comparison: .orderedDescending, failure: .immatureSignature, decodeError: "Not before claim (nbf) must be an integer") ??
7-
validateDate(payload, key: "iat", comparison: .orderedDescending, failure: .invalidIssuedAt, decodeError: "Issued at claim (iat) must be an integer")
3+
func validateClaims(_ payload:Payload, audience:String?, issuer:String?) throws {
4+
try validateIssuer(payload, issuer: issuer)
5+
try validateAudience(payload, audience: audience)
6+
try validateDate(payload, key: "exp", comparison: .orderedAscending, failure: .expiredSignature, decodeError: "Expiration time claim (exp) must be an integer")
7+
try validateDate(payload, key: "nbf", comparison: .orderedDescending, failure: .immatureSignature, decodeError: "Not before claim (nbf) must be an integer")
8+
try validateDate(payload, key: "iat", comparison: .orderedDescending, failure: .invalidIssuedAt, decodeError: "Issued at claim (iat) must be an integer")
89
}
910

10-
func validateAudience(_ payload:Payload, audience:String?) -> InvalidToken? {
11+
func validateAudience(_ payload:Payload, audience:String?) throws {
1112
if let audience = audience {
1213
if let aud = payload["aud"] as? [String] {
1314
if !aud.contains(audience) {
14-
return .invalidAudience
15+
throw InvalidToken.invalidAudience
1516
}
1617
} else if let aud = payload["aud"] as? String {
1718
if aud != audience {
18-
return .invalidAudience
19+
throw InvalidToken.invalidAudience
1920
}
2021
} else {
21-
return .decodeError("Invalid audience claim, must be a string or an array of strings")
22+
throw InvalidToken.decodeError("Invalid audience claim, must be a string or an array of strings")
2223
}
2324
}
24-
25-
return nil
2625
}
2726

28-
func validateIssuer(_ payload:Payload, issuer:String?) -> InvalidToken? {
27+
func validateIssuer(_ payload:Payload, issuer:String?) throws {
2928
if let issuer = issuer {
3029
if let iss = payload["iss"] as? String {
3130
if iss != issuer {
32-
return .invalidIssuer
31+
throw InvalidToken.invalidIssuer
3332
}
3433
} else {
35-
return .invalidIssuer
34+
throw InvalidToken.invalidIssuer
3635
}
3736
}
38-
39-
return nil
4037
}
4138

42-
func validateDate(_ payload:Payload, key:String, comparison:ComparisonResult, failure:InvalidToken, decodeError:String) -> InvalidToken? {
39+
func validateDate(_ payload:Payload, key:String, comparison:ComparisonResult, failure:InvalidToken, decodeError:String) throws {
4340
if let timestamp = payload[key] as? TimeInterval ?? (payload[key] as? NSString)?.doubleValue as TimeInterval? {
4441
let date = Date(timeIntervalSince1970: timestamp)
4542
if date.compare(Date()) == comparison {
46-
return failure
43+
throw failure
4744
}
4845
} else if payload[key] != nil {
49-
return .decodeError(decodeError)
46+
throw InvalidToken.decodeError(decodeError)
5047
}
51-
52-
return nil
5348
}

Sources/Decode.swift

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,8 @@ public func decode(_ jwt:String, algorithms:[Algorithm], verify:Bool = true, aud
5151
switch load(jwt) {
5252
case let .success(header, payload, signature, signatureInput):
5353
if verify {
54-
if let failure = validateClaims(payload, audience: audience, issuer: issuer) ?? verifySignature(algorithms, header: header, signingInput: signatureInput, signature: signature) {
55-
throw failure
56-
}
54+
try validateClaims(payload, audience: audience, issuer: issuer)
55+
try verifySignature(algorithms, header: header, signingInput: signatureInput, signature: signature)
5756
}
5857

5958
return payload
@@ -115,17 +114,17 @@ func load(_ jwt:String) -> LoadResult {
115114

116115
// MARK: Signature Verification
117116

118-
func verifySignature(_ algorithms:[Algorithm], header:Payload, signingInput:String, signature:Data) -> InvalidToken? {
117+
func verifySignature(_ algorithms:[Algorithm], header:Payload, signingInput:String, signature:Data) throws {
119118
if let alg = header["alg"] as? String {
120119
let matchingAlgorithms = algorithms.filter { algorithm in algorithm.description == alg }
121120
let results = matchingAlgorithms.map { algorithm in algorithm.verify(signingInput, signature: signature) }
122121
let successes = results.filter { $0 }
123122
if successes.count > 0 {
124-
return nil
123+
return
125124
}
126125

127-
return .invalidAlgorithm
126+
throw InvalidToken.invalidAlgorithm
128127
}
129128

130-
return .decodeError("Missing Algorithm")
129+
throw InvalidToken.decodeError("Missing Algorithm")
131130
}

0 commit comments

Comments
 (0)