@@ -3,16 +3,23 @@ import JWTKit
3
3
import XCTVapor
4
4
5
5
class JWTTests : XCTestCase {
6
+ var app : Application !
7
+
8
+ override func setUp( ) async throws {
9
+ app = try await Application . make ( . testing)
10
+ XCTAssert ( isLoggingConfigured)
11
+ }
12
+
13
+ override func tearDown( ) async throws {
14
+ try await app. asyncShutdown ( )
15
+ }
16
+
6
17
func testDocs( ) async throws {
7
- // creates a new application for testing
8
- let app = Application ( . testing)
9
- defer { app. shutdown ( ) }
10
-
11
18
// Add HMAC with SHA-256 signer.
12
- await app. jwt. keys. addHMAC ( key : " secret " , digestAlgorithm: . sha256)
19
+ await app. jwt. keys. add ( hmac : " secret " , digestAlgorithm: . sha256)
13
20
14
- await app. jwt. keys. addHMAC ( key : " foo " , digestAlgorithm: . sha256, kid: " a " )
15
- await app. jwt. keys. addHMAC ( key : " bar " , digestAlgorithm: . sha256, kid: " b " )
21
+ await app. jwt. keys. add ( hmac : " foo " , digestAlgorithm: . sha256, kid: " a " )
22
+ await app. jwt. keys. add ( hmac : " bar " , digestAlgorithm: . sha256, kid: " b " )
16
23
17
24
app. jwt. apple. applicationIdentifier = " ... "
18
25
app. get ( " apple " ) { req async throws -> HTTPStatus in
@@ -101,16 +108,18 @@ class JWTTests: XCTestCase {
101
108
}
102
109
}
103
110
104
- try app. test ( . GET, " me " , beforeRequest: { req in
111
+ try await app. test ( . GET, " me " , beforeRequest: { req in
105
112
req. headers. bearerAuthorization = . init( token: """
106
113
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ2YXBvciIsImV4cCI6NjQwOTIyMTEyMDAsImFkbWluIjp0cnVlfQ.lS5lpwfRNSZDvpGQk6x5JI1g40gkYCOWqbc3J_ghowo
107
114
""" )
108
115
print ( req)
109
- } , afterResponse: { res in
116
+ } , afterResponse: { res async in
110
117
XCTAssertEqual ( res. status, . ok)
111
- } ) . test ( . POST, " login " , beforeRequest: { req in
118
+ } )
119
+
120
+ try await app. test ( . POST, " login " , beforeRequest: { req in
112
121
print ( req)
113
- } , afterResponse: { res in
122
+ } , afterResponse: { res async throws in
114
123
XCTAssertEqual ( res. status, . ok)
115
124
print ( res. body. string)
116
125
try XCTAssertNotNil ( res. content. decode ( [ String : String ] . self) [ " token " ] )
@@ -119,12 +128,8 @@ class JWTTests: XCTestCase {
119
128
120
129
// manual authentication using req.jwt.verify
121
130
func testManual( ) async throws {
122
- // creates a new application for testing
123
- let app = Application ( . testing)
124
- defer { app. shutdown ( ) }
125
-
126
131
// configures an es512 signer using random key
127
- await app. jwt. keys. addECDSA ( key : ES512PrivateKey ( ) )
132
+ await app. jwt. keys. add ( ecdsa : ES512PrivateKey ( ) )
128
133
129
134
// jwt creation using req.jwt.sign
130
135
app. post ( " login " ) { req async throws -> LoginResponse in
@@ -142,9 +147,9 @@ class JWTTests: XCTestCase {
142
147
var token : String ?
143
148
144
149
// test login
145
- try app. testable ( ) . test ( . POST, " login " , beforeRequest: { req in
150
+ try await app. testable ( ) . test ( . POST, " login " , beforeRequest: { req in
146
151
try req. content. encode ( LoginCredentials ( name: " foo " ) )
147
- } ) { res in
152
+ } ) { res async throws in
148
153
XCTAssertEqual ( res. status, . ok)
149
154
XCTAssertContent ( LoginResponse . self, res) { login in
150
155
token = login. token
@@ -157,31 +162,27 @@ class JWTTests: XCTestCase {
157
162
}
158
163
159
164
// test manual authentication using req.jwt.verify
160
- try app. testable ( ) . test (
165
+ try await app. testable ( ) . test (
161
166
. GET, " me " , headers: [ " authorization " : " Bearer \( t) " ]
162
- ) { res in
167
+ ) { res async in
163
168
XCTAssertEqual ( res. status, . ok)
164
169
XCTAssertEqual ( res. body. string, " foo " )
165
170
}
166
171
167
172
// create a token from a different signer
168
173
let fakeToken = try await JWTKeyCollection ( )
169
- . addECDSA ( key : ES512PrivateKey ( ) ) . sign ( TestUser ( name: " bob " ) )
170
- try app. testable ( ) . test (
174
+ . add ( ecdsa : ES512PrivateKey ( ) ) . sign ( TestUser ( name: " bob " ) )
175
+ try await app. testable ( ) . test (
171
176
. GET, " me " , headers: [ " authorization " : " Bearer \( fakeToken) " ]
172
- ) { res in
177
+ ) { res async in
173
178
XCTAssertEqual ( res. status, . unauthorized)
174
179
}
175
180
}
176
181
177
182
// test middleware-based authentication using req.auth.require
178
183
func testMiddleware( ) async throws {
179
- // creates a new application for testing
180
- let app = Application ( . testing)
181
- defer { app. shutdown ( ) }
182
-
183
184
// configures an es512 signer using random key
184
- await app. jwt. keys. addECDSA ( key : ES512PrivateKey ( ) )
185
+ await app. jwt. keys. add ( ecdsa : ES512PrivateKey ( ) )
185
186
186
187
// jwt creation using req.jwt.sign
187
188
app. post ( " login " ) { req async throws -> LoginResponse in
@@ -208,23 +209,23 @@ class JWTTests: XCTestCase {
208
209
var token : String ?
209
210
210
211
// test login
211
- try app. testable ( ) . test ( . POST, " login " , beforeRequest: { req in
212
+ try await app. testable ( ) . test ( . POST, " login " , beforeRequest: { req in
212
213
try req. content. encode ( LoginCredentials ( name: " foo " ) )
213
- } ) { res in
214
+ } ) { res async in
214
215
XCTAssertEqual ( res. status, . ok)
215
216
XCTAssertContent ( LoginResponse . self, res) { login in
216
217
token = login. token
217
218
}
218
219
}
219
220
220
- guard let t = token else {
221
+ guard let token else {
221
222
XCTFail ( " login failed " )
222
223
return
223
224
}
224
225
225
- try app. testable ( ) . test (
226
- . GET, " me " , headers: [ " authorization " : " Bearer \( t ) " ]
227
- ) { res in
226
+ try await app. testable ( ) . test (
227
+ . GET, " me " , headers: [ " authorization " : " Bearer \( token ) " ]
228
+ ) { res async in
228
229
XCTAssertEqual ( res. status, . ok)
229
230
XCTAssertContent ( TestUser . self, res) { user in
230
231
XCTAssertEqual ( user. name, " foo " )
@@ -234,17 +235,17 @@ class JWTTests: XCTestCase {
234
235
// token from same signer but for a different user
235
236
// this tests that the guard middleware catches the failure to auth before it reaches the route handler
236
237
let wrongNameToken = try await app. jwt. keys. sign ( TestUser ( name: " bob " ) )
237
- try app. testable ( ) . test (
238
+ try await app. testable ( ) . test (
238
239
. GET, " me " , headers: [ " authorization " : " Bearer \( wrongNameToken) " ]
239
- ) { res in
240
+ ) { res async in
240
241
XCTAssertEqual ( res. status, . unauthorized)
241
242
}
242
243
243
244
// create a token from a different signer
244
- let fakeToken = try await JWTKeyCollection ( ) . addECDSA ( key : ES512PrivateKey ( ) ) . sign ( TestUser ( name: " bob " ) )
245
- try app. testable ( ) . test (
245
+ let fakeToken = try await JWTKeyCollection ( ) . add ( ecdsa : ES512PrivateKey ( ) ) . sign ( TestUser ( name: " bob " ) )
246
+ try await app. testable ( ) . test (
246
247
. GET, " me " , headers: [ " authorization " : " Bearer \( fakeToken) " ]
247
- ) { res in
248
+ ) { res async in
248
249
XCTAssertEqual ( res. status, . unauthorized)
249
250
}
250
251
}
@@ -255,10 +256,6 @@ class JWTTests: XCTestCase {
255
256
Note that it takes a day for the JWT to expire before the test passes
256
257
*/
257
258
func testApple( ) async throws {
258
- // creates a new application for testing
259
- let app = Application ( . testing)
260
- defer { app. shutdown ( ) }
261
-
262
259
app. jwt. apple. applicationIdentifier = " dev.timc.siwa-demo.TILiOS "
263
260
264
261
app. get ( " test " ) { req async throws in
@@ -274,9 +271,11 @@ class JWTTests: XCTestCase {
274
271
eyJraWQiOiJmaDZCczhDIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiZGV2LnRpbWMuc2l3YS1kZW1vLlRJTGlPUyIsImV4cCI6MTcwODUxNTY3NiwiaWF0IjoxNzA4NDI5Mjc2LCJzdWIiOiIwMDE1NDIuYjA0MTAwYzUxYWNiNDhkM2E1NzA2ODRmMTdkNjM5NGQuMTYwMyIsImNfaGFzaCI6ImFxQjM1RXR1bWFtVUg0VjZBYklmaXciLCJlbWFpbCI6Ijh5c2JjaHZjMm1AcHJpdmF0ZXJlbGF5LmFwcGxlaWQuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImlzX3ByaXZhdGVfZW1haWwiOnRydWUsImF1dGhfdGltZSI6MTcwODQyOTI3Niwibm9uY2Vfc3VwcG9ydGVkIjp0cnVlLCJyZWFsX3VzZXJfc3RhdHVzIjoyfQ.E4SmBvvsr-L1f4rbwoXIg23XJEdA6WQxLfT6Z0TaFRTNbufuUtvG41MwJvf62T3HdCsY1VXlhdVYmTNbzqCuax6CUObue2ndx6osInDzfTkzysx17eUeCaG1XCfq9mScuVgW8xh3ZPfIeQdsII-MnP8ZG7q-CAxf6soSza_BKrrw4TArvEXrjbZO7FI1U2K72JtVZ118wcuEWfv8JO-FWFOHgWzJujqxI_7ayVG-mQfZitmYXv5ws-stZMxA0RvIbuYLWAksI6-ehYEgeEQa6NzzcJNWm3oArB0ithQE59fqFDoKCwpLchBMANz3tmNpN194Rc4ppL-niIDWFE-0Ug
275
272
""" )
276
273
277
- try app. test ( . GET, " test " , headers: headers) { res in
274
+ try await app. test ( . GET, " test " , headers: headers) { res async in
278
275
XCTAssertEqual ( res. status, . unauthorized)
279
- } . test ( . GET, " test2 " , headers: headers) { res in
276
+ }
277
+
278
+ try await app. test ( . GET, " test2 " , headers: headers) { res async in
280
279
XCTAssertEqual ( res. status, . unauthorized)
281
280
}
282
281
}
@@ -290,10 +289,6 @@ class JWTTests: XCTestCase {
290
289
func verify( using _: some JWTAlgorithm ) throws { }
291
290
}
292
291
293
- // creates a new application for testing
294
- let app = Application ( . testing)
295
- defer { app. shutdown ( ) }
296
-
297
292
let privateKeyString = """
298
293
-----BEGIN RSA PRIVATE KEY-----
299
294
MIIEowIBAAKCAQEAhAHFb1M+P7qjwVlR7Es/3GBq3yICZP1eZ/JShBuLO4stTGHR
@@ -324,8 +319,8 @@ class JWTTests: XCTestCase {
324
319
-----END RSA PRIVATE KEY-----
325
320
"""
326
321
327
- try await app. jwt. keys. addRSA (
328
- key : Insecure . RSA. PrivateKey ( pem: [ UInt8] ( privateKeyString. utf8) ) ,
322
+ try await app. jwt. keys. add (
323
+ rsa : Insecure . RSA. PrivateKey ( pem: [ UInt8] ( privateKeyString. utf8) ) ,
329
324
digestAlgorithm: . sha256
330
325
)
331
326
@@ -336,15 +331,11 @@ class JWTTests: XCTestCase {
336
331
}
337
332
338
333
for _ in 0 ..< 1000 {
339
- try app. test ( . GET, " / " ) { res in
334
+ try await app. test ( . GET, " / " ) { res async in
340
335
XCTAssertEqual ( res. status, . ok)
341
336
}
342
337
}
343
338
}
344
-
345
- override func setUp( ) {
346
- XCTAssert ( isLoggingConfigured)
347
- }
348
339
}
349
340
350
341
extension ByteBuffer {
0 commit comments