react-native-authsignal 1.8.1 → 2.0.0-alpha2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/authsignal/react/AuthsignalInAppModule.kt +135 -0
- package/android/src/main/java/com/authsignal/react/AuthsignalPackage.kt +2 -1
- package/android/src/main/java/com/authsignal/react/AuthsignalPushModule.kt +8 -1
- package/android/src/main/java/com/authsignal/react/{AuthsignalDeviceModule.kt → AuthsignalQRCodeModule.kt} +6 -55
- package/ios/AuthsignalInAppModule.m +26 -0
- package/ios/AuthsignalInAppModule.swift +163 -0
- package/ios/AuthsignalPushModule.swift +9 -1
- package/ios/{AuthsignalDeviceModule.m → AuthsignalQRModule.m} +1 -7
- package/ios/{AuthsignalDeviceModule.swift → AuthsignalQRModule.swift} +4 -64
- package/lib/commonjs/inapp.js +100 -0
- package/lib/commonjs/inapp.js.map +1 -0
- package/lib/commonjs/index.js +14 -34
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/push.js.map +1 -1
- package/lib/commonjs/{device.js → qr.js} +11 -39
- package/lib/commonjs/qr.js.map +1 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/inapp.js +93 -0
- package/lib/module/inapp.js.map +1 -0
- package/lib/module/index.js +14 -34
- package/lib/module/index.js.map +1 -1
- package/lib/module/push.js.map +1 -1
- package/lib/module/{device.js → qr.js} +9 -37
- package/lib/module/qr.js.map +1 -0
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/inapp.d.ts +19 -0
- package/lib/typescript/inapp.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +4 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/push.d.ts +4 -14
- package/lib/typescript/push.d.ts.map +1 -1
- package/lib/typescript/qr.d.ts +20 -0
- package/lib/typescript/qr.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +13 -13
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native-authsignal.podspec +1 -1
- package/src/inapp.ts +122 -0
- package/src/index.tsx +13 -18
- package/src/push.ts +7 -18
- package/src/{device.ts → qr.ts} +16 -66
- package/src/types.ts +14 -13
- package/lib/commonjs/device.js.map +0 -1
- package/lib/module/device.js.map +0 -1
- package/lib/typescript/device.d.ts +0 -35
- package/lib/typescript/device.d.ts.map +0 -1
package/android/build.gradle
CHANGED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
package com.authsignal.react
|
|
2
|
+
|
|
3
|
+
import android.util.Log
|
|
4
|
+
import com.authsignal.inapp.AuthsignalInApp
|
|
5
|
+
import com.facebook.react.bridge.Arguments
|
|
6
|
+
import com.facebook.react.bridge.Promise
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
9
|
+
import com.facebook.react.bridge.ReactMethod
|
|
10
|
+
import kotlinx.coroutines.CoroutineScope
|
|
11
|
+
import kotlinx.coroutines.Dispatchers
|
|
12
|
+
import kotlinx.coroutines.SupervisorJob
|
|
13
|
+
import kotlinx.coroutines.launch
|
|
14
|
+
|
|
15
|
+
class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
16
|
+
ReactContextBaseJavaModule(
|
|
17
|
+
reactContext
|
|
18
|
+
) {
|
|
19
|
+
private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
|
20
|
+
private var authsignal: AuthsignalInApp? = null
|
|
21
|
+
private var defaultError = "unexpected_error"
|
|
22
|
+
|
|
23
|
+
override fun getConstants(): Map<String, Any>? {
|
|
24
|
+
val constants: MutableMap<String, Any> = HashMap()
|
|
25
|
+
constants["bundleIdentifier"] = reactContext.applicationInfo.packageName
|
|
26
|
+
return constants
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun getName(): String {
|
|
30
|
+
return "AuthsignalInAppModule"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@ReactMethod
|
|
34
|
+
fun initialize(tenantID: String?, baseURL: String?, promise: Promise) {
|
|
35
|
+
Log.d("AuthsignalInAppModule", "initialize: $tenantID, $baseURL")
|
|
36
|
+
authsignal = AuthsignalInApp(tenantID!!, baseURL!!)
|
|
37
|
+
|
|
38
|
+
promise.resolve(null)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@ReactMethod
|
|
42
|
+
fun getCredential(promise: Promise) {
|
|
43
|
+
launch(promise) {
|
|
44
|
+
val response = it.getCredential()
|
|
45
|
+
|
|
46
|
+
if (response.error != null) {
|
|
47
|
+
val errorCode = response.errorCode ?: defaultError
|
|
48
|
+
|
|
49
|
+
promise.reject(errorCode, response.error)
|
|
50
|
+
} else if (response.data != null) {
|
|
51
|
+
val credential = response.data
|
|
52
|
+
val map = Arguments.createMap()
|
|
53
|
+
map.putString("credentialId", credential!!.credentialId)
|
|
54
|
+
map.putString("createdAt", credential.createdAt)
|
|
55
|
+
map.putString("userId", credential.userId)
|
|
56
|
+
map.putString("lastAuthenticatedAt", credential.lastAuthenticatedAt)
|
|
57
|
+
promise.resolve(map)
|
|
58
|
+
} else {
|
|
59
|
+
promise.resolve(null)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@ReactMethod
|
|
65
|
+
fun addCredential(
|
|
66
|
+
token: String?,
|
|
67
|
+
promise: Promise
|
|
68
|
+
) {
|
|
69
|
+
launch(promise) {
|
|
70
|
+
val response = it.addCredential(token, null)
|
|
71
|
+
|
|
72
|
+
if (response.error != null) {
|
|
73
|
+
val errorCode = response.errorCode ?: defaultError
|
|
74
|
+
|
|
75
|
+
promise.reject(errorCode, response.error)
|
|
76
|
+
} else {
|
|
77
|
+
val credential = response.data
|
|
78
|
+
val map = Arguments.createMap()
|
|
79
|
+
map.putString("credentialId", credential!!.credentialId)
|
|
80
|
+
map.putString("createdAt", credential.createdAt)
|
|
81
|
+
map.putString("userId", credential.userId)
|
|
82
|
+
map.putString("lastAuthenticatedAt", credential.lastAuthenticatedAt)
|
|
83
|
+
promise.resolve(map)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@ReactMethod
|
|
89
|
+
fun removeCredential(promise: Promise) {
|
|
90
|
+
launch(promise) {
|
|
91
|
+
val response = it.removeCredential()
|
|
92
|
+
|
|
93
|
+
if (response.error != null) {
|
|
94
|
+
val errorCode = response.errorCode ?: defaultError
|
|
95
|
+
|
|
96
|
+
promise.reject(errorCode, response.error)
|
|
97
|
+
} else {
|
|
98
|
+
promise.resolve(response.data)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@ReactMethod
|
|
104
|
+
fun verify(promise: Promise) {
|
|
105
|
+
launch(promise) {
|
|
106
|
+
val response = it.verify()
|
|
107
|
+
|
|
108
|
+
if (response.error != null) {
|
|
109
|
+
val errorCode = response.errorCode ?: defaultError
|
|
110
|
+
|
|
111
|
+
promise.reject(errorCode, response.error)
|
|
112
|
+
} else {
|
|
113
|
+
val data = response.data!!
|
|
114
|
+
val map = Arguments.createMap()
|
|
115
|
+
map.putString("token", data.token)
|
|
116
|
+
map.putString("userId", data.userId)
|
|
117
|
+
map.putString("userAuthenticatorId", data.userAuthenticatorId)
|
|
118
|
+
map.putString("username", data.username)
|
|
119
|
+
promise.resolve(map)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private fun launch(promise: Promise, fn: suspend (client: AuthsignalDevice) -> Unit) {
|
|
125
|
+
coroutineScope.launch {
|
|
126
|
+
authsignal?.let {
|
|
127
|
+
fn(it)
|
|
128
|
+
} ?: run {
|
|
129
|
+
Log.w("init_error", "AuthsignalInAppModule is not initialized.")
|
|
130
|
+
|
|
131
|
+
promise.resolve(null)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -12,7 +12,8 @@ class AuthsignalPackage : ReactPackage {
|
|
|
12
12
|
AuthsignalEmailModule(reactContext),
|
|
13
13
|
AuthsignalPasskeyModule(reactContext),
|
|
14
14
|
AuthsignalPushModule(reactContext),
|
|
15
|
-
|
|
15
|
+
AuthsignalInAppModule(reactContext),
|
|
16
|
+
AuthsignalQRCodeModule(reactContext),
|
|
16
17
|
AuthsignalSMSModule(reactContext),
|
|
17
18
|
AuthsignalTOTPModule(reactContext),
|
|
18
19
|
AuthsignalWhatsappModule(reactContext)
|
|
@@ -51,6 +51,7 @@ class AuthsignalPushModule(private val reactContext: ReactApplicationContext) :
|
|
|
51
51
|
val map = Arguments.createMap()
|
|
52
52
|
map.putString("credentialId", credential!!.credentialId)
|
|
53
53
|
map.putString("createdAt", credential.createdAt)
|
|
54
|
+
map.putString("userId", credential.userId)
|
|
54
55
|
map.putString("lastAuthenticatedAt", credential.lastAuthenticatedAt)
|
|
55
56
|
promise.resolve(map)
|
|
56
57
|
}
|
|
@@ -70,7 +71,13 @@ class AuthsignalPushModule(private val reactContext: ReactApplicationContext) :
|
|
|
70
71
|
|
|
71
72
|
promise.reject(errorCode, response.error)
|
|
72
73
|
} else {
|
|
73
|
-
|
|
74
|
+
val credential = response.data
|
|
75
|
+
val map = Arguments.createMap()
|
|
76
|
+
map.putString("credentialId", credential!!.credentialId)
|
|
77
|
+
map.putString("createdAt", credential.createdAt)
|
|
78
|
+
map.putString("userId", credential.userId)
|
|
79
|
+
map.putString("lastAuthenticatedAt", credential.lastAuthenticatedAt)
|
|
80
|
+
promise.resolve(map)
|
|
74
81
|
}
|
|
75
82
|
}
|
|
76
83
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
package com.authsignal.react
|
|
2
2
|
|
|
3
3
|
import android.util.Log
|
|
4
|
-
import com.authsignal.
|
|
4
|
+
import com.authsignal.qr.AuthsignalQRCode
|
|
5
5
|
import com.facebook.react.bridge.Arguments
|
|
6
6
|
import com.facebook.react.bridge.Promise
|
|
7
7
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
@@ -12,12 +12,12 @@ import kotlinx.coroutines.Dispatchers
|
|
|
12
12
|
import kotlinx.coroutines.SupervisorJob
|
|
13
13
|
import kotlinx.coroutines.launch
|
|
14
14
|
|
|
15
|
-
class
|
|
15
|
+
class AuthsignalQRCodeModule(private val reactContext: ReactApplicationContext) :
|
|
16
16
|
ReactContextBaseJavaModule(
|
|
17
17
|
reactContext
|
|
18
18
|
) {
|
|
19
19
|
private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
|
20
|
-
private var authsignal:
|
|
20
|
+
private var authsignal: AuthsignalQRCode? = null
|
|
21
21
|
private var defaultError = "unexpected_error"
|
|
22
22
|
|
|
23
23
|
override fun getConstants(): Map<String, Any>? {
|
|
@@ -27,12 +27,12 @@ class AuthsignalDeviceModule(private val reactContext: ReactApplicationContext)
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
override fun getName(): String {
|
|
30
|
-
return "
|
|
30
|
+
return "AuthsignalQRCodeModule"
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
@ReactMethod
|
|
34
34
|
fun initialize(tenantID: String?, baseURL: String?, promise: Promise) {
|
|
35
|
-
Log.d("
|
|
35
|
+
Log.d("AuthsignalQRCodeModule", "initialize: $tenantID, $baseURL")
|
|
36
36
|
authsignal = AuthsignalDevice(tenantID!!, baseURL!!)
|
|
37
37
|
|
|
38
38
|
promise.resolve(null)
|
|
@@ -100,34 +100,6 @@ class AuthsignalDeviceModule(private val reactContext: ReactApplicationContext)
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
@ReactMethod
|
|
104
|
-
fun getChallenge(promise: Promise) {
|
|
105
|
-
launch(promise) {
|
|
106
|
-
val response = it.getChallenge()
|
|
107
|
-
|
|
108
|
-
if (response.error != null) {
|
|
109
|
-
val errorCode = response.errorCode ?: defaultError
|
|
110
|
-
|
|
111
|
-
promise.reject(errorCode, response.error)
|
|
112
|
-
} else {
|
|
113
|
-
val challenge = response.data
|
|
114
|
-
|
|
115
|
-
if (challenge == null) {
|
|
116
|
-
promise.resolve(null)
|
|
117
|
-
} else {
|
|
118
|
-
val map = Arguments.createMap()
|
|
119
|
-
map.putString("challengeId", challenge.challengeId)
|
|
120
|
-
map.putString("actionCode", challenge.actionCode)
|
|
121
|
-
map.putString("idempotencyKey", challenge.idempotencyKey)
|
|
122
|
-
map.putString("ipAddress", challenge.ipAddress)
|
|
123
|
-
map.putString("deviceId", challenge.deviceId)
|
|
124
|
-
map.putString("userAgent", challenge.userAgent)
|
|
125
|
-
promise.resolve(map)
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
103
|
@ReactMethod
|
|
132
104
|
fun claimChallenge(
|
|
133
105
|
challengeId: String,
|
|
@@ -175,33 +147,12 @@ class AuthsignalDeviceModule(private val reactContext: ReactApplicationContext)
|
|
|
175
147
|
}
|
|
176
148
|
}
|
|
177
149
|
|
|
178
|
-
@ReactMethod
|
|
179
|
-
fun verify(promise: Promise) {
|
|
180
|
-
launch(promise) {
|
|
181
|
-
val response = it.verify()
|
|
182
|
-
|
|
183
|
-
if (response.error != null) {
|
|
184
|
-
val errorCode = response.errorCode ?: defaultError
|
|
185
|
-
|
|
186
|
-
promise.reject(errorCode, response.error)
|
|
187
|
-
} else {
|
|
188
|
-
val data = response.data!!
|
|
189
|
-
val map = Arguments.createMap()
|
|
190
|
-
map.putString("token", data.token)
|
|
191
|
-
map.putString("userId", data.userId)
|
|
192
|
-
map.putString("userAuthenticatorId", data.userAuthenticatorId)
|
|
193
|
-
map.putString("username", data.username)
|
|
194
|
-
promise.resolve(map)
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
150
|
private fun launch(promise: Promise, fn: suspend (client: AuthsignalDevice) -> Unit) {
|
|
200
151
|
coroutineScope.launch {
|
|
201
152
|
authsignal?.let {
|
|
202
153
|
fn(it)
|
|
203
154
|
} ?: run {
|
|
204
|
-
Log.w("init_error", "
|
|
155
|
+
Log.w("init_error", "AuthsignalQRCodeModule is not initialized.")
|
|
205
156
|
|
|
206
157
|
promise.resolve(null)
|
|
207
158
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
@interface RCT_EXTERN_MODULE(AuthsignalInAppModule, NSObject)
|
|
5
|
+
|
|
6
|
+
RCT_EXTERN_METHOD(initialize:(NSString)tenantID
|
|
7
|
+
withBaseURL:(NSString)baseURL
|
|
8
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
9
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
10
|
+
|
|
11
|
+
RCT_EXTERN_METHOD(getCredential:(RCTPromiseResolveBlock)resolve
|
|
12
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
13
|
+
|
|
14
|
+
RCT_EXTERN_METHOD(addCredential:(NSString)token
|
|
15
|
+
withRequireUserAuthentication:(BOOL)requireUserAuthentication
|
|
16
|
+
withKeychainAccess:(NSString)keychainAccess
|
|
17
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
18
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
19
|
+
|
|
20
|
+
RCT_EXTERN_METHOD(removeCredential:(RCTPromiseResolveBlock)resolve
|
|
21
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
22
|
+
|
|
23
|
+
RCT_EXTERN_METHOD(verify:(RCTPromiseResolveBlock)resolve
|
|
24
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
25
|
+
|
|
26
|
+
@end
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import Security
|
|
2
|
+
import Foundation
|
|
3
|
+
import Authsignal
|
|
4
|
+
|
|
5
|
+
@objc(AuthsignalInAppModule)
|
|
6
|
+
class AuthsignalInAppModule: NSObject {
|
|
7
|
+
var authsignal: AuthsignalInApp?
|
|
8
|
+
|
|
9
|
+
@objc static func requiresMainQueueSetup() -> Bool {
|
|
10
|
+
return true
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@objc func initialize(
|
|
14
|
+
_ tenantID: NSString,
|
|
15
|
+
withBaseURL baseURL: NSString,
|
|
16
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
17
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
18
|
+
) -> Void {
|
|
19
|
+
self.authsignal = AuthsignalInApp(tenantID: tenantID as String, baseURL: baseURL as String)
|
|
20
|
+
|
|
21
|
+
resolve(nil)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@objc func getCredential(
|
|
25
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
26
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
27
|
+
) -> Void {
|
|
28
|
+
guard let authsignal = authsignal else {
|
|
29
|
+
resolve(nil)
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Task.init {
|
|
34
|
+
let response = await authsignal.getCredential()
|
|
35
|
+
|
|
36
|
+
if let error = response.error {
|
|
37
|
+
reject(response.errorCode ?? "unexpected_error", error, nil)
|
|
38
|
+
} else if let data = response.data {
|
|
39
|
+
let credential: [String: String?] = [
|
|
40
|
+
"credentialId": data.credentialId,
|
|
41
|
+
"createdAt": data.createdAt,
|
|
42
|
+
"userId": data.userId,
|
|
43
|
+
"lastAuthenticatedAt": data.lastAuthenticatedAt,
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
resolve(credential)
|
|
47
|
+
} else {
|
|
48
|
+
resolve(nil)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@objc func addCredential(
|
|
54
|
+
_ token: NSString?,
|
|
55
|
+
withRequireUserAuthentication requireUserAuthentication: Bool,
|
|
56
|
+
withKeychainAccess keychainAccess: NSString,
|
|
57
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
58
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
59
|
+
) -> Void {
|
|
60
|
+
guard let authsignal = authsignal else {
|
|
61
|
+
resolve(nil)
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let tokenStr = token as String?
|
|
66
|
+
let userPresenceRequired = requireUserAuthentication as Bool
|
|
67
|
+
let keychainAccess = getKeychainAccess(value: keychainAccess as String?)
|
|
68
|
+
|
|
69
|
+
Task.init {
|
|
70
|
+
let response = await authsignal.addCredential(
|
|
71
|
+
token: tokenStr,
|
|
72
|
+
keychainAccess: keychainAccess,
|
|
73
|
+
userPresenceRequired: userPresenceRequired
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
if let error = response.error {
|
|
77
|
+
reject(response.errorCode ?? "unexpected_error", error, nil)
|
|
78
|
+
} else if let data = response.data {
|
|
79
|
+
let credential: [String: String?] = [
|
|
80
|
+
"credentialId": data.credentialId,
|
|
81
|
+
"createdAt": data.createdAt,
|
|
82
|
+
"userId": data.userId,
|
|
83
|
+
"lastAuthenticatedAt": data.lastAuthenticatedAt,
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
resolve(credential)
|
|
87
|
+
} else {
|
|
88
|
+
resolve(nil)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@objc func removeCredential(
|
|
94
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
95
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
96
|
+
) -> Void {
|
|
97
|
+
guard let authsignal = authsignal else {
|
|
98
|
+
resolve(nil)
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
Task.init {
|
|
103
|
+
let response = await authsignal.removeCredential()
|
|
104
|
+
|
|
105
|
+
if let error = response.error {
|
|
106
|
+
reject(response.errorCode ?? "unexpected_error", error, nil)
|
|
107
|
+
} else {
|
|
108
|
+
resolve(response.data)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@objc func verify(
|
|
114
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
115
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
116
|
+
) -> Void {
|
|
117
|
+
guard let authsignal = authsignal else {
|
|
118
|
+
resolve(nil)
|
|
119
|
+
return
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
Task.init {
|
|
123
|
+
let response = await authsignal.verify()
|
|
124
|
+
|
|
125
|
+
if let error = response.error {
|
|
126
|
+
reject(response.errorCode ?? "unexpected_error", error, nil)
|
|
127
|
+
} else if let data = response.data {
|
|
128
|
+
let result: [String: String?] = [
|
|
129
|
+
"token": data.token,
|
|
130
|
+
"userId": data.userId,
|
|
131
|
+
"userAuthenticatorId": data.userAuthenticatorId,
|
|
132
|
+
"username": data.username,
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
resolve(result)
|
|
136
|
+
} else {
|
|
137
|
+
resolve(nil)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
func getKeychainAccess(value: String?) -> KeychainAccess {
|
|
143
|
+
switch value {
|
|
144
|
+
case "afterFirstUnlock":
|
|
145
|
+
return .afterFirstUnlock
|
|
146
|
+
|
|
147
|
+
case "afterFirstUnlockThisDeviceOnly":
|
|
148
|
+
return .afterFirstUnlockThisDeviceOnly
|
|
149
|
+
|
|
150
|
+
case "whenUnlocked":
|
|
151
|
+
return .whenUnlocked
|
|
152
|
+
|
|
153
|
+
case "whenUnlockedThisDeviceOnly":
|
|
154
|
+
return .whenUnlockedThisDeviceOnly
|
|
155
|
+
|
|
156
|
+
case "whenPasscodeSetThisDeviceOnly":
|
|
157
|
+
return .whenPasscodeSetThisDeviceOnly
|
|
158
|
+
|
|
159
|
+
default:
|
|
160
|
+
return .whenUnlockedThisDeviceOnly
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -39,6 +39,7 @@ class AuthsignalPushModule: NSObject {
|
|
|
39
39
|
let credential: [String: String?] = [
|
|
40
40
|
"credentialId": data.credentialId,
|
|
41
41
|
"createdAt": data.createdAt,
|
|
42
|
+
"userId": data.userId,
|
|
42
43
|
"lastAuthenticatedAt": data.lastAuthenticatedAt,
|
|
43
44
|
]
|
|
44
45
|
|
|
@@ -75,7 +76,14 @@ class AuthsignalPushModule: NSObject {
|
|
|
75
76
|
if let error = response.error {
|
|
76
77
|
reject(response.errorCode ?? "unexpected_error", error, nil)
|
|
77
78
|
} else {
|
|
78
|
-
|
|
79
|
+
let credential: [String: String?] = [
|
|
80
|
+
"credentialId": response.data!.credentialId,
|
|
81
|
+
"createdAt": response.data!.createdAt,
|
|
82
|
+
"userId": response.data!.userId,
|
|
83
|
+
"lastAuthenticatedAt": response.data!.lastAuthenticatedAt,
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
resolve(credential)
|
|
79
87
|
}
|
|
80
88
|
}
|
|
81
89
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#import <React/RCTBridgeModule.h>
|
|
2
2
|
#import <Foundation/Foundation.h>
|
|
3
3
|
|
|
4
|
-
@interface RCT_EXTERN_MODULE(
|
|
4
|
+
@interface RCT_EXTERN_MODULE(AuthsignalQRCodeModule, NSObject)
|
|
5
5
|
|
|
6
6
|
RCT_EXTERN_METHOD(initialize:(NSString)tenantID
|
|
7
7
|
withBaseURL:(NSString)baseURL
|
|
@@ -20,9 +20,6 @@ RCT_EXTERN_METHOD(addCredential:(NSString)token
|
|
|
20
20
|
RCT_EXTERN_METHOD(removeCredential:(RCTPromiseResolveBlock)resolve
|
|
21
21
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
22
22
|
|
|
23
|
-
RCT_EXTERN_METHOD(getChallenge:(RCTPromiseResolveBlock)resolve
|
|
24
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
25
|
-
|
|
26
23
|
RCT_EXTERN_METHOD(claimChallenge:(NSString)challengeId
|
|
27
24
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
28
25
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
@@ -33,7 +30,4 @@ RCT_EXTERN_METHOD(updateChallenge:(NSString)challengeId
|
|
|
33
30
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
34
31
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
35
32
|
|
|
36
|
-
RCT_EXTERN_METHOD(verify:(RCTPromiseResolveBlock)resolve
|
|
37
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
38
|
-
|
|
39
33
|
@end
|
|
@@ -2,9 +2,9 @@ import Security
|
|
|
2
2
|
import Foundation
|
|
3
3
|
import Authsignal
|
|
4
4
|
|
|
5
|
-
@objc(
|
|
6
|
-
class
|
|
7
|
-
var authsignal:
|
|
5
|
+
@objc(AuthsignalQRCodeModule)
|
|
6
|
+
class AuthsignalQRCodeModule: NSObject {
|
|
7
|
+
var authsignal: AuthsignalQRCode?
|
|
8
8
|
|
|
9
9
|
@objc static func requiresMainQueueSetup() -> Bool {
|
|
10
10
|
return true
|
|
@@ -16,7 +16,7 @@ class AuthsignalDeviceModule: NSObject {
|
|
|
16
16
|
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
17
17
|
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
18
18
|
) -> Void {
|
|
19
|
-
self.authsignal =
|
|
19
|
+
self.authsignal = AuthsignalQRCode(tenantID: tenantID as String, baseURL: baseURL as String)
|
|
20
20
|
|
|
21
21
|
resolve(nil)
|
|
22
22
|
}
|
|
@@ -110,37 +110,6 @@ class AuthsignalDeviceModule: NSObject {
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
@objc func getChallenge(
|
|
114
|
-
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
115
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
116
|
-
) -> Void {
|
|
117
|
-
guard let authsignal = authsignal else {
|
|
118
|
-
resolve(nil)
|
|
119
|
-
return
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
Task.init {
|
|
123
|
-
let response = await authsignal.getChallenge()
|
|
124
|
-
|
|
125
|
-
if let error = response.error {
|
|
126
|
-
reject(response.errorCode ?? "unexpected_error", error, nil)
|
|
127
|
-
} else if let data = response.data as? DeviceChallenge {
|
|
128
|
-
let challenge: [String: String?] = [
|
|
129
|
-
"challengeId": data.challengeId,
|
|
130
|
-
"actionCode": data.actionCode,
|
|
131
|
-
"idempotencyKey": data.idempotencyKey,
|
|
132
|
-
"userAgent": data.userAgent,
|
|
133
|
-
"deviceId": data.deviceId,
|
|
134
|
-
"ipAddress": data.ipAddress,
|
|
135
|
-
]
|
|
136
|
-
|
|
137
|
-
resolve(challenge)
|
|
138
|
-
} else {
|
|
139
|
-
resolve(nil)
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
113
|
@objc func claimChallenge(
|
|
145
114
|
_ challengeId: NSString,
|
|
146
115
|
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
@@ -203,35 +172,6 @@ class AuthsignalDeviceModule: NSObject {
|
|
|
203
172
|
}
|
|
204
173
|
}
|
|
205
174
|
|
|
206
|
-
@objc func verify(
|
|
207
|
-
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
208
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
209
|
-
) -> Void {
|
|
210
|
-
guard let authsignal = authsignal else {
|
|
211
|
-
resolve(nil)
|
|
212
|
-
return
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
Task.init {
|
|
216
|
-
let response = await authsignal.verify()
|
|
217
|
-
|
|
218
|
-
if let error = response.error {
|
|
219
|
-
reject(response.errorCode ?? "unexpected_error", error, nil)
|
|
220
|
-
} else if let data = response.data {
|
|
221
|
-
let result: [String: String?] = [
|
|
222
|
-
"token": data.token,
|
|
223
|
-
"userId": data.userId,
|
|
224
|
-
"userAuthenticatorId": data.userAuthenticatorId,
|
|
225
|
-
"username": data.username,
|
|
226
|
-
]
|
|
227
|
-
|
|
228
|
-
resolve(result)
|
|
229
|
-
} else {
|
|
230
|
-
resolve(nil)
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
175
|
func getKeychainAccess(value: String?) -> KeychainAccess {
|
|
236
176
|
switch value {
|
|
237
177
|
case "afterFirstUnlock":
|