3
3
//
4
4
5
5
import XCTest
6
+ import CryptoKit
6
7
7
8
@testable import IterableSDK
8
9
10
+ @available ( iOS 13 , * )
9
11
class AuthTests : XCTestCase {
10
12
private static let apiKey = " zeeApiKey "
11
13
private static let email = " [email protected] "
@@ -37,9 +39,9 @@ class AuthTests: XCTestCase {
37
39
}
38
40
39
41
func testEmailWithTokenPersistence( ) {
40
- let emailToken = " asdf "
42
+ let authToken = AuthTests . generateJwt ( )
41
43
42
- let authDelegate = createAuthDelegate ( { emailToken } )
44
+ let authDelegate = createAuthDelegate ( { authToken } )
43
45
44
46
let config = IterableConfig ( )
45
47
config. authDelegate = authDelegate
@@ -48,11 +50,11 @@ class AuthTests: XCTestCase {
48
50
49
51
internalAPI
. email
= " [email protected] "
50
52
51
- internalAPI. setEmail ( AuthTests . email)
53
+ internalAPI. email = AuthTests . email
52
54
53
55
XCTAssertEqual ( internalAPI. email, AuthTests . email)
54
56
XCTAssertNil ( internalAPI. userId)
55
- XCTAssertEqual ( internalAPI. auth . authToken, emailToken )
57
+ XCTAssertEqual ( internalAPI. authToken, authToken )
56
58
}
57
59
58
60
func testUserIdWithTokenPersistence( ) {
@@ -888,4 +890,45 @@ class AuthTests: XCTestCase {
888
890
889
891
return " asdf. \( payload. data ( using: . utf8) !. base64EncodedString ( ) ) .asdf "
890
892
}
893
+
894
+ /// adapated from https://stackoverflow.com/questions/60290703/how-do-i-generate-a-jwt-to-use-in-api-authentication-for-swift-app
895
+ private static func generateJwt( ) -> String {
896
+ let secret = " secret "
897
+ let privateKey = SymmetricKey ( data: Data ( secret. utf8) )
898
+
899
+ struct Header : Encodable {
900
+ let alg = " HS256 "
901
+ let typ = " JWT "
902
+ }
903
+
904
+ struct Payload : Encodable {
905
+ let email = AuthTests . email
906
+ let iat = Date ( )
907
+ let exp = Date ( timeIntervalSinceNow: 24 * 60 * 1 )
908
+ }
909
+
910
+ let headerJsonData = try ! JSONEncoder ( ) . encode ( Header ( ) )
911
+ let headerBase64 = headerJsonData. urlEncodedBase64 ( )
912
+
913
+ let payloadJsonData = try ! JSONEncoder ( ) . encode ( Payload ( ) )
914
+ let payloadBase64 = payloadJsonData. urlEncodedBase64 ( )
915
+
916
+ let toSign = Data ( ( headerBase64 + " . " + payloadBase64) . utf8)
917
+
918
+ let signature = HMAC< SHA256> . authenticationCode( for: toSign, using: privateKey)
919
+ let signatureBase64 = Data ( signature) . urlEncodedBase64 ( )
920
+
921
+ let token = [ headerBase64, payloadBase64, signatureBase64] . joined ( separator: " . " )
922
+
923
+ return token
924
+ }
925
+ }
926
+
927
+ extension Data {
928
+ func urlEncodedBase64( ) -> String {
929
+ return base64EncodedString ( )
930
+ . replacingOccurrences ( of: " + " , with: " - " )
931
+ . replacingOccurrences ( of: " / " , with: " _ " )
932
+ . replacingOccurrences ( of: " = " , with: " " )
933
+ }
891
934
}
0 commit comments