Skip to content

Commit 20f6d20

Browse files
committed
Support ISS claims
1 parent b689dc0 commit 20f6d20

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

JWT/JWT.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ public typealias Payload = [String:AnyObject]
44

55
public enum InvalidToken : Printable {
66
case DecodeError(String)
7+
case InvalidIssuer
78

89
public var description:String {
910
switch self {
1011
case .DecodeError(let error):
1112
return "Decode Error: \(error)"
13+
case .InvalidIssuer:
14+
return "Invalid Issuer"
1215
}
1316
}
1417
}
@@ -20,9 +23,15 @@ public enum DecodeResult {
2023

2124

2225
/// Decode a JWT
23-
public func decode(jwt:String, verify:Bool = false) -> DecodeResult {
26+
public func decode(jwt:String, verify:Bool = true, audience:String? = nil, issuer:String? = nil) -> DecodeResult {
2427
switch load(jwt) {
2528
case let .Success(header, payload, signature, signatureInput):
29+
if verify {
30+
if let failure = validateClaims(payload, audience, issuer) {
31+
return .Failure(failure)
32+
}
33+
}
34+
2635
return .Success(payload)
2736
case .Failure(let failure):
2837
return .Failure(failure)
@@ -90,3 +99,18 @@ func load(jwt:String) -> LoadResult {
9099

91100
return .Success(header:header!, payload:payload!, signature:signature!, signatureInput:signatureInput)
92101
}
102+
103+
// MARK: Validation
104+
105+
func validateClaims(payload:Payload, audience:String?, issuer:String?) -> InvalidToken? {
106+
if let issuer = issuer {
107+
if let iss = payload["iss"] as? String {
108+
if iss != issuer {
109+
return .InvalidIssuer
110+
}
111+
} else {
112+
return .InvalidIssuer
113+
}
114+
}
115+
return nil
116+
}

JWTTests/JWTTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,25 @@ class JWTDecodeTests : XCTestCase {
1212
func testFailsToDecodeInvalidStringWithoutThreeSegments() {
1313
assertDecodeError(decode("a.b"), "Not enough segments")
1414
}
15+
16+
// MARK : Issuer validation
17+
18+
func testSuccessfulIssuerValidation() {
19+
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmdWxsZXIubGkifQ.wOhJ9_6lx-3JGJPmJmtFCDI3kt7uMAMmhHIslti7ryI"
20+
assertSuccess(decode(jwt, issuer:"fuller.li")) { payload in
21+
XCTAssertEqual(payload as NSDictionary, ["iss": "fuller.li"])
22+
}
23+
}
24+
25+
func testIncorrectIssuerValidation() {
26+
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmdWxsZXIubGkifQ.wOhJ9_6lx-3JGJPmJmtFCDI3kt7uMAMmhHIslti7ryI"
27+
assertFailure(decode(jwt, issuer:"querykit.org"))
28+
}
29+
30+
func testMissingIssuerValidation() {
31+
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.2_8pWJfyPup0YwOXK7g9Dn0cF1E3pdn299t4hSeJy5w"
32+
assertFailure(decode(jwt, issuer:"fuller.li"))
33+
}
1534
}
1635

1736
// MARK: Helpers
@@ -47,6 +66,8 @@ func assertDecodeError(result:DecodeResult, error:String) {
4766
if decodeError != error {
4867
XCTFail("Incorrect decode error \(decodeError) != \(error)")
4968
}
69+
default:
70+
XCTFail("Failure for the wrong reason")
5071
}
5172
}
5273
}

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,18 @@ pod 'JWT'
1414

1515
## Usage
1616

17+
### Verify a JWT
18+
1719
```swift
1820
import JWT
1921

20-
JWT.verify(claims)
22+
JWT.verify("eyJhbG...y5w")
2123
```
2224

25+
#### Supported claims
26+
27+
- Issuer (`iss`) Claim
28+
2329
## License
2430

2531
JWT is licensed under the BSD license. See [LICENSE](LICENSE) for more info.

0 commit comments

Comments
 (0)