@@ -58,6 +58,28 @@ public func decode(jwt:String, key:String? = nil, verify:Bool = true, audience:S
58
58
}
59
59
}
60
60
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
+
61
83
// MARK: Parsing a JWT
62
84
63
85
enum LoadResult {
@@ -66,6 +88,16 @@ enum LoadResult {
66
88
}
67
89
68
90
/// 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
+
69
101
func base64decode( input: String ) -> NSData ? {
70
102
let rem = countElements ( input) % 4
71
103
0 commit comments