Skip to content

Commit d871f44

Browse files
committed
Support JWT encoding
1 parent 1fdf2bb commit d871f44

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

JWT/JWT.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,28 @@ public func decode(jwt:String, key:String? = nil, verify:Bool = true, audience:S
5858
}
5959
}
6060

61+
62+
/// Encoding a payload
63+
64+
public func encode(payload:Payload, key:String) -> String {
65+
func encode(payload:Payload) -> String? {
66+
if let data = NSJSONSerialization.dataWithJSONObject(payload, options: NSJSONWritingOptions(0), error: nil) {
67+
return base64encode(data)
68+
}
69+
70+
return nil
71+
}
72+
73+
let algorithm = "HS256"
74+
let header = encode(["typ": "JWT", "alg": algorithm])!
75+
let payload = encode(payload)!
76+
let signingInput = "\(header).\(payload)"
77+
let mac = Authenticator.HMAC(key: key.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!, variant:.sha256)
78+
let result = mac.authenticate(signingInput.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)!
79+
let signature = base64encode(result)
80+
return "\(signingInput).\(signature)"
81+
}
82+
6183
// MARK: Parsing a JWT
6284

6385
enum LoadResult {
@@ -66,6 +88,16 @@ enum LoadResult {
6688
}
6789

6890
/// URL Base64 Decoding
91+
92+
func base64encode(input:NSData) -> String {
93+
let data = input.base64EncodedDataWithOptions(NSDataBase64EncodingOptions(0))
94+
let string = NSString(data: data, encoding: NSUTF8StringEncoding) as String
95+
return string
96+
.stringByReplacingOccurrencesOfString("+", withString: "-", options: NSStringCompareOptions(0), range: nil)
97+
.stringByReplacingOccurrencesOfString("/", withString: "_", options: NSStringCompareOptions(0), range: nil)
98+
.stringByReplacingOccurrencesOfString("=", withString: "", options: NSStringCompareOptions(0), range: nil)
99+
}
100+
69101
func base64decode(input:String) -> NSData? {
70102
let rem = countElements(input) % 4
71103

JWTTests/JWTTests.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
import XCTest
22
import JWT
33

4+
class JWTEncodeTests : XCTestCase {
5+
func testEncodingJWT() {
6+
let payload = ["name": "Kyle"] as Payload
7+
let jwt = JWT.encode(payload, "secret")
8+
let fixture = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiS3lsZSJ9.zxm7xcp1eZtZhp4t-nlw09ATQnnFKIiSN83uG8u6cAg"
9+
XCTAssertEqual(jwt, fixture)
10+
}
11+
}
12+
413
class JWTDecodeTests : XCTestCase {
514
func testDecodingValidJWT() {
615
let jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiS3lsZSJ9.zxm7xcp1eZtZhp4t-nlw09ATQnnFKIiSN83uG8u6cAg"

0 commit comments

Comments
 (0)