|
1 | 1 | import Foundation
|
2 | 2 |
|
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") |
8 | 9 | }
|
9 | 10 |
|
10 |
| -func validateAudience(_ payload:Payload, audience:String?) -> InvalidToken? { |
| 11 | +func validateAudience(_ payload:Payload, audience:String?) throws { |
11 | 12 | if let audience = audience {
|
12 | 13 | if let aud = payload["aud"] as? [String] {
|
13 | 14 | if !aud.contains(audience) {
|
14 |
| - return .invalidAudience |
| 15 | + throw InvalidToken.invalidAudience |
15 | 16 | }
|
16 | 17 | } else if let aud = payload["aud"] as? String {
|
17 | 18 | if aud != audience {
|
18 |
| - return .invalidAudience |
| 19 | + throw InvalidToken.invalidAudience |
19 | 20 | }
|
20 | 21 | } 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") |
22 | 23 | }
|
23 | 24 | }
|
24 |
| - |
25 |
| - return nil |
26 | 25 | }
|
27 | 26 |
|
28 |
| -func validateIssuer(_ payload:Payload, issuer:String?) -> InvalidToken? { |
| 27 | +func validateIssuer(_ payload:Payload, issuer:String?) throws { |
29 | 28 | if let issuer = issuer {
|
30 | 29 | if let iss = payload["iss"] as? String {
|
31 | 30 | if iss != issuer {
|
32 |
| - return .invalidIssuer |
| 31 | + throw InvalidToken.invalidIssuer |
33 | 32 | }
|
34 | 33 | } else {
|
35 |
| - return .invalidIssuer |
| 34 | + throw InvalidToken.invalidIssuer |
36 | 35 | }
|
37 | 36 | }
|
38 |
| - |
39 |
| - return nil |
40 | 37 | }
|
41 | 38 |
|
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 { |
43 | 40 | if let timestamp = payload[key] as? TimeInterval ?? (payload[key] as? NSString)?.doubleValue as TimeInterval? {
|
44 | 41 | let date = Date(timeIntervalSince1970: timestamp)
|
45 | 42 | if date.compare(Date()) == comparison {
|
46 |
| - return failure |
| 43 | + throw failure |
47 | 44 | }
|
48 | 45 | } else if payload[key] != nil {
|
49 |
| - return .decodeError(decodeError) |
| 46 | + throw InvalidToken.decodeError(decodeError) |
50 | 47 | }
|
51 |
| - |
52 |
| - return nil |
53 | 48 | }
|
0 commit comments