@@ -48,17 +48,13 @@ public enum InvalidToken : CustomStringConvertible, Error {
48
48
49
49
/// Decode a JWT
50
50
public func decode( _ jwt: String , algorithms: [ Algorithm ] , verify: Bool = true , audience: String ? = nil , issuer: String ? = nil ) throws -> Payload {
51
- switch load ( jwt) {
52
- case let . success( header, payload, signature, signatureInput) :
53
- if verify {
54
- try validateClaims ( payload, audience: audience, issuer: issuer)
55
- try verifySignature ( algorithms, header: header, signingInput: signatureInput, signature: signature)
56
- }
57
-
58
- return payload
59
- case . failure( let failure) :
60
- throw failure
51
+ let ( header, payload, signature, signatureInput) = try load ( jwt)
52
+ if verify {
53
+ try validateClaims ( payload, audience: audience, issuer: issuer)
54
+ try verifySignature ( algorithms, header: header, signingInput: signatureInput, signature: signature)
61
55
}
56
+
57
+ return payload
62
58
}
63
59
64
60
/// Decode a JWT
@@ -68,15 +64,10 @@ public func decode(_ jwt:String, algorithm:Algorithm, verify:Bool = true, audien
68
64
69
65
// MARK: Parsing a JWT
70
66
71
- enum LoadResult {
72
- case success( header: Payload , payload: Payload , signature: Data , signatureInput: String )
73
- case failure( InvalidToken )
74
- }
75
-
76
- func load( _ jwt: String ) -> LoadResult {
67
+ func load( _ jwt: String ) throws -> ( header: Payload , payload: Payload , signature: Data , signatureInput: String ) {
77
68
let segments = jwt. components ( separatedBy: " . " )
78
69
if segments. count != 3 {
79
- return . failure ( . decodeError( " Not enough segments " ) )
70
+ throw InvalidToken . decodeError ( " Not enough segments " )
80
71
}
81
72
82
73
let headerSegment = segments [ 0 ]
@@ -86,30 +77,30 @@ func load(_ jwt:String) -> LoadResult {
86
77
87
78
let headerData = base64decode ( headerSegment)
88
79
if headerData == nil {
89
- return . failure ( . decodeError( " Header is not correctly encoded as base64 " ) )
80
+ throw InvalidToken . decodeError ( " Header is not correctly encoded as base64 " )
90
81
}
91
82
92
83
let header = ( try ? JSONSerialization . jsonObject ( with: headerData!, options: JSONSerialization . ReadingOptions ( rawValue: 0 ) ) ) as? Payload
93
84
if header == nil {
94
- return . failure ( . decodeError( " Invalid header " ) )
85
+ throw InvalidToken . decodeError ( " Invalid header " )
95
86
}
96
87
97
88
let payloadData = base64decode ( payloadSegment)
98
89
if payloadData == nil {
99
- return . failure ( . decodeError( " Payload is not correctly encoded as base64 " ) )
90
+ throw InvalidToken . decodeError ( " Payload is not correctly encoded as base64 " )
100
91
}
101
92
102
93
let payload = ( try ? JSONSerialization . jsonObject ( with: payloadData!, options: JSONSerialization . ReadingOptions ( rawValue: 0 ) ) ) as? Payload
103
94
if payload == nil {
104
- return . failure ( . decodeError( " Invalid payload " ) )
95
+ throw InvalidToken . decodeError ( " Invalid payload " )
105
96
}
106
97
107
98
let signature = base64decode ( signatureSegment)
108
99
if signature == nil {
109
- return . failure ( . decodeError( " Signature is not correctly encoded as base64 " ) )
100
+ throw InvalidToken . decodeError ( " Signature is not correctly encoded as base64 " )
110
101
}
111
102
112
- return . success ( header: header!, payload: payload!, signature: signature!, signatureInput: signatureInput)
103
+ return ( header: header!, payload: payload!, signature: signature!, signatureInput: signatureInput)
113
104
}
114
105
115
106
// MARK: Signature Verification
0 commit comments