react-native-authsignal 2.6.1 → 2.8.0-alpha.2
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 +3 -19
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/authsignal/react/AuthsignalEmailModule.kt +11 -18
- package/android/src/main/java/com/authsignal/react/AuthsignalInAppModule.kt +61 -45
- package/android/src/main/java/com/authsignal/react/AuthsignalModule.kt +25 -39
- package/android/src/main/java/com/authsignal/react/AuthsignalPackage.kt +70 -17
- package/android/src/main/java/com/authsignal/react/AuthsignalPasskeyModule.kt +23 -17
- package/android/src/main/java/com/authsignal/react/AuthsignalPushModule.kt +16 -21
- package/android/src/main/java/com/authsignal/react/AuthsignalQRCodeModule.kt +16 -22
- package/android/src/main/java/com/authsignal/react/AuthsignalSMSModule.kt +11 -25
- package/android/src/main/java/com/authsignal/react/AuthsignalTOTPModule.kt +10 -17
- package/android/src/main/java/com/authsignal/react/AuthsignalWhatsappModule.kt +10 -23
- package/ios/AuthsignalEmailModule.m +7 -7
- package/ios/AuthsignalEmailModule.swift +10 -9
- package/ios/AuthsignalInAppModule.m +18 -17
- package/ios/AuthsignalInAppModule.swift +41 -27
- package/ios/AuthsignalModule.m +4 -4
- package/ios/AuthsignalModule.swift +14 -10
- package/ios/AuthsignalPasskeyModule.m +10 -10
- package/ios/AuthsignalPasskeyModule.swift +22 -21
- package/ios/AuthsignalPushModule.m +9 -9
- package/ios/AuthsignalPushModule.swift +14 -13
- package/ios/AuthsignalQRModule.m +10 -10
- package/ios/AuthsignalQRModule.swift +15 -14
- package/ios/AuthsignalSMSModule.m +7 -7
- package/ios/AuthsignalSMSModule.swift +10 -9
- package/ios/AuthsignalTOTPModule.m +5 -5
- package/ios/AuthsignalTOTPModule.swift +8 -7
- package/ios/AuthsignalTurboModules.mm +26 -0
- package/ios/AuthsignalWhatsappModule.m +5 -5
- package/ios/AuthsignalWhatsappModule.swift +8 -7
- package/lib/commonjs/NativeAuthsignalEmailModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalEmailModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalInAppModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalInAppModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalPasskeyModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalPasskeyModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalPushModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalPushModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalQRCodeModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalQRCodeModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalSMSModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalSMSModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalTOTPModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalTOTPModule.js.map +1 -0
- package/lib/commonjs/NativeAuthsignalWhatsappModule.js +9 -0
- package/lib/commonjs/NativeAuthsignalWhatsappModule.js.map +1 -0
- package/lib/commonjs/email.js +7 -9
- package/lib/commonjs/email.js.map +1 -1
- package/lib/commonjs/getNativeModule.js +23 -0
- package/lib/commonjs/getNativeModule.js.map +1 -0
- package/lib/commonjs/inapp.js +15 -16
- package/lib/commonjs/inapp.js.map +1 -1
- package/lib/commonjs/index.js +6 -27
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/passkey.js +21 -31
- package/lib/commonjs/passkey.js.map +1 -1
- package/lib/commonjs/push.js +8 -10
- package/lib/commonjs/push.js.map +1 -1
- package/lib/commonjs/qr.js +8 -10
- package/lib/commonjs/qr.js.map +1 -1
- package/lib/commonjs/sms.js +7 -9
- package/lib/commonjs/sms.js.map +1 -1
- package/lib/commonjs/totp.js +7 -9
- package/lib/commonjs/totp.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/whatsapp.js +7 -9
- package/lib/commonjs/whatsapp.js.map +1 -1
- package/lib/module/NativeAuthsignalEmailModule.js +3 -0
- package/lib/module/NativeAuthsignalEmailModule.js.map +1 -0
- package/lib/module/NativeAuthsignalInAppModule.js +3 -0
- package/lib/module/NativeAuthsignalInAppModule.js.map +1 -0
- package/lib/module/NativeAuthsignalModule.js +3 -0
- package/lib/module/NativeAuthsignalModule.js.map +1 -0
- package/lib/module/NativeAuthsignalPasskeyModule.js +3 -0
- package/lib/module/NativeAuthsignalPasskeyModule.js.map +1 -0
- package/lib/module/NativeAuthsignalPushModule.js +3 -0
- package/lib/module/NativeAuthsignalPushModule.js.map +1 -0
- package/lib/module/NativeAuthsignalQRCodeModule.js +3 -0
- package/lib/module/NativeAuthsignalQRCodeModule.js.map +1 -0
- package/lib/module/NativeAuthsignalSMSModule.js +3 -0
- package/lib/module/NativeAuthsignalSMSModule.js.map +1 -0
- package/lib/module/NativeAuthsignalTOTPModule.js +3 -0
- package/lib/module/NativeAuthsignalTOTPModule.js.map +1 -0
- package/lib/module/NativeAuthsignalWhatsappModule.js +3 -0
- package/lib/module/NativeAuthsignalWhatsappModule.js.map +1 -0
- package/lib/module/email.js +7 -10
- package/lib/module/email.js.map +1 -1
- package/lib/module/getNativeModule.js +17 -0
- package/lib/module/getNativeModule.js.map +1 -0
- package/lib/module/inapp.js +15 -17
- package/lib/module/inapp.js.map +1 -1
- package/lib/module/index.js +4 -27
- package/lib/module/index.js.map +1 -1
- package/lib/module/passkey.js +22 -33
- package/lib/module/passkey.js.map +1 -1
- package/lib/module/push.js +8 -11
- package/lib/module/push.js.map +1 -1
- package/lib/module/qr.js +8 -11
- package/lib/module/qr.js.map +1 -1
- package/lib/module/sms.js +7 -10
- package/lib/module/sms.js.map +1 -1
- package/lib/module/totp.js +7 -10
- package/lib/module/totp.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/whatsapp.js +7 -10
- package/lib/module/whatsapp.js.map +1 -1
- package/lib/typescript/NativeAuthsignalEmailModule.d.ts +10 -0
- package/lib/typescript/NativeAuthsignalEmailModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalInAppModule.d.ts +15 -0
- package/lib/typescript/NativeAuthsignalInAppModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalModule.d.ts +8 -0
- package/lib/typescript/NativeAuthsignalModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalPasskeyModule.d.ts +12 -0
- package/lib/typescript/NativeAuthsignalPasskeyModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalPushModule.d.ts +12 -0
- package/lib/typescript/NativeAuthsignalPushModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalQRCodeModule.d.ts +12 -0
- package/lib/typescript/NativeAuthsignalQRCodeModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalSMSModule.d.ts +10 -0
- package/lib/typescript/NativeAuthsignalSMSModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalTOTPModule.d.ts +9 -0
- package/lib/typescript/NativeAuthsignalTOTPModule.d.ts.map +1 -0
- package/lib/typescript/NativeAuthsignalWhatsappModule.d.ts +9 -0
- package/lib/typescript/NativeAuthsignalWhatsappModule.d.ts.map +1 -0
- package/lib/typescript/email.d.ts +1 -0
- package/lib/typescript/email.d.ts.map +1 -1
- package/lib/typescript/getNativeModule.d.ts +2 -0
- package/lib/typescript/getNativeModule.d.ts.map +1 -0
- package/lib/typescript/inapp.d.ts +2 -1
- package/lib/typescript/inapp.d.ts.map +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/passkey.d.ts +2 -0
- package/lib/typescript/passkey.d.ts.map +1 -1
- package/lib/typescript/push.d.ts +1 -0
- package/lib/typescript/push.d.ts.map +1 -1
- package/lib/typescript/qr.d.ts +1 -0
- package/lib/typescript/qr.d.ts.map +1 -1
- package/lib/typescript/sms.d.ts +1 -0
- package/lib/typescript/sms.d.ts.map +1 -1
- package/lib/typescript/totp.d.ts +1 -0
- package/lib/typescript/totp.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +5 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/whatsapp.d.ts +1 -0
- package/lib/typescript/whatsapp.d.ts.map +1 -1
- package/package.json +10 -1
- package/react-native-authsignal.podspec +3 -2
- package/src/NativeAuthsignalEmailModule.ts +10 -0
- package/src/NativeAuthsignalInAppModule.ts +32 -0
- package/src/NativeAuthsignalModule.ts +8 -0
- package/src/NativeAuthsignalPasskeyModule.ts +26 -0
- package/src/NativeAuthsignalPushModule.ts +20 -0
- package/src/NativeAuthsignalQRCodeModule.ts +20 -0
- package/src/NativeAuthsignalSMSModule.ts +10 -0
- package/src/NativeAuthsignalTOTPModule.ts +9 -0
- package/src/NativeAuthsignalWhatsappModule.ts +9 -0
- package/src/email.ts +90 -0
- package/src/email.web.ts +105 -0
- package/src/error.ts +28 -0
- package/src/error.web.ts +21 -0
- package/src/getNativeModule.ts +28 -0
- package/src/inapp.ts +220 -0
- package/src/index.tsx +80 -0
- package/src/index.web.tsx +99 -0
- package/src/passkey.ts +165 -0
- package/src/passkey.web.ts +153 -0
- package/src/push.ts +147 -0
- package/src/qr.ts +150 -0
- package/src/sms.ts +92 -0
- package/src/sms.web.ts +107 -0
- package/src/totp.ts +79 -0
- package/src/totp.web.ts +95 -0
- package/src/types.ts +161 -0
- package/src/web-client.ts +29 -0
- package/src/whatsapp.ts +76 -0
- package/src/whatsapp.web.ts +83 -0
package/android/build.gradle
CHANGED
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
buildscript {
|
|
2
|
-
def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["Authsignal_kotlinVersion"]
|
|
3
|
-
|
|
4
|
-
repositories {
|
|
5
|
-
google()
|
|
6
|
-
mavenCentral()
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
dependencies {
|
|
10
|
-
classpath 'com.android.tools.build:gradle:8.1.4'
|
|
11
|
-
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
1
|
apply plugin: 'com.android.library'
|
|
16
2
|
apply plugin: 'org.jetbrains.kotlin.android'
|
|
3
|
+
apply plugin: 'com.facebook.react'
|
|
17
4
|
|
|
18
5
|
def getExtOrDefault(name) {
|
|
19
6
|
return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['Authsignal_' + name]
|
|
@@ -45,7 +32,7 @@ android {
|
|
|
45
32
|
}
|
|
46
33
|
}
|
|
47
34
|
|
|
48
|
-
|
|
35
|
+
lint {
|
|
49
36
|
disable 'GradleCompatible'
|
|
50
37
|
}
|
|
51
38
|
|
|
@@ -68,14 +55,11 @@ repositories {
|
|
|
68
55
|
google()
|
|
69
56
|
}
|
|
70
57
|
|
|
71
|
-
def kotlin_version = getExtOrDefault("kotlinVersion")
|
|
72
|
-
|
|
73
58
|
dependencies {
|
|
74
59
|
//noinspection GradleDynamicVersion
|
|
75
60
|
implementation "com.facebook.react:react-native:+"
|
|
76
|
-
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
77
61
|
|
|
78
62
|
implementation "androidx.browser:browser:1.2.0"
|
|
79
63
|
|
|
80
|
-
implementation("com.authsignal:authsignal-android:3.4.
|
|
64
|
+
implementation("com.authsignal:authsignal-android:3.4.1-alpha.2")
|
|
81
65
|
}
|
|
@@ -5,35 +5,24 @@ import com.authsignal.email.AuthsignalEmail
|
|
|
5
5
|
import com.facebook.react.bridge.Arguments
|
|
6
6
|
import com.facebook.react.bridge.Promise
|
|
7
7
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
9
8
|
import com.facebook.react.bridge.ReactMethod
|
|
9
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
10
10
|
import kotlinx.coroutines.CoroutineScope
|
|
11
11
|
import kotlinx.coroutines.Dispatchers
|
|
12
12
|
import kotlinx.coroutines.SupervisorJob
|
|
13
13
|
import kotlinx.coroutines.launch
|
|
14
14
|
|
|
15
|
+
@ReactModule(name = AuthsignalEmailModule.NAME)
|
|
15
16
|
class AuthsignalEmailModule(private val reactContext: ReactApplicationContext) :
|
|
16
|
-
|
|
17
|
-
reactContext
|
|
18
|
-
) {
|
|
17
|
+
NativeAuthsignalEmailModuleSpec(reactContext) {
|
|
19
18
|
private var authsignal: AuthsignalEmail? = null
|
|
20
19
|
|
|
21
20
|
private val defaultError = "unexpected_error"
|
|
22
21
|
|
|
23
22
|
private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
|
24
23
|
|
|
25
|
-
override fun getConstants(): Map<String, Any>? {
|
|
26
|
-
val constants: MutableMap<String, Any> = HashMap()
|
|
27
|
-
constants["bundleIdentifier"] = reactContext.applicationInfo.packageName
|
|
28
|
-
return constants
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
override fun getName(): String {
|
|
32
|
-
return "AuthsignalEmailModule"
|
|
33
|
-
}
|
|
34
|
-
|
|
35
24
|
@ReactMethod
|
|
36
|
-
fun initialize(tenantID: String, baseURL: String, promise: Promise) {
|
|
25
|
+
override fun initialize(tenantID: String, baseURL: String, promise: Promise) {
|
|
37
26
|
val currentActivity = reactContext.currentActivity
|
|
38
27
|
|
|
39
28
|
if (currentActivity != null) {
|
|
@@ -44,7 +33,7 @@ class AuthsignalEmailModule(private val reactContext: ReactApplicationContext) :
|
|
|
44
33
|
}
|
|
45
34
|
|
|
46
35
|
@ReactMethod
|
|
47
|
-
fun enroll(email: String, promise: Promise) {
|
|
36
|
+
override fun enroll(email: String, promise: Promise) {
|
|
48
37
|
launch(promise) {
|
|
49
38
|
val response = it.enroll(email)
|
|
50
39
|
|
|
@@ -62,7 +51,7 @@ class AuthsignalEmailModule(private val reactContext: ReactApplicationContext) :
|
|
|
62
51
|
}
|
|
63
52
|
|
|
64
53
|
@ReactMethod
|
|
65
|
-
fun challenge(promise: Promise) {
|
|
54
|
+
override fun challenge(promise: Promise) {
|
|
66
55
|
launch(promise) {
|
|
67
56
|
val response = it.challenge()
|
|
68
57
|
|
|
@@ -80,7 +69,7 @@ class AuthsignalEmailModule(private val reactContext: ReactApplicationContext) :
|
|
|
80
69
|
}
|
|
81
70
|
|
|
82
71
|
@ReactMethod
|
|
83
|
-
fun verify(code: String, promise: Promise) {
|
|
72
|
+
override fun verify(code: String, promise: Promise) {
|
|
84
73
|
launch(promise) {
|
|
85
74
|
val response = it.verify(code)
|
|
86
75
|
|
|
@@ -110,4 +99,8 @@ class AuthsignalEmailModule(private val reactContext: ReactApplicationContext) :
|
|
|
110
99
|
}
|
|
111
100
|
}
|
|
112
101
|
}
|
|
102
|
+
|
|
103
|
+
companion object {
|
|
104
|
+
const val NAME = "AuthsignalEmailModule"
|
|
105
|
+
}
|
|
113
106
|
}
|
|
@@ -2,44 +2,34 @@ package com.authsignal.react
|
|
|
2
2
|
|
|
3
3
|
import android.util.Log
|
|
4
4
|
import com.authsignal.inapp.AuthsignalInApp
|
|
5
|
+
import com.authsignal.models.api.AppAttestation
|
|
5
6
|
import com.facebook.react.bridge.Arguments
|
|
6
7
|
import com.facebook.react.bridge.Promise
|
|
7
8
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
9
9
|
import com.facebook.react.bridge.ReactMethod
|
|
10
|
+
import com.facebook.react.bridge.ReadableMap
|
|
11
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
10
12
|
import kotlinx.coroutines.CoroutineScope
|
|
11
13
|
import kotlinx.coroutines.Dispatchers
|
|
12
14
|
import kotlinx.coroutines.SupervisorJob
|
|
13
15
|
import kotlinx.coroutines.launch
|
|
14
16
|
|
|
17
|
+
@ReactModule(name = AuthsignalInAppModule.NAME)
|
|
15
18
|
class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
16
|
-
|
|
17
|
-
reactContext
|
|
18
|
-
) {
|
|
19
|
+
NativeAuthsignalInAppModuleSpec(reactContext) {
|
|
19
20
|
private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
|
20
21
|
private var authsignal: AuthsignalInApp? = null
|
|
21
22
|
private var defaultError = "unexpected_error"
|
|
22
23
|
|
|
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
24
|
@ReactMethod
|
|
34
|
-
fun initialize(tenantID: String
|
|
35
|
-
|
|
36
|
-
authsignal = AuthsignalInApp(tenantID!!, baseURL!!, context = reactContext)
|
|
25
|
+
override fun initialize(tenantID: String, baseURL: String, promise: Promise) {
|
|
26
|
+
authsignal = AuthsignalInApp(tenantID, baseURL, context = reactContext)
|
|
37
27
|
|
|
38
28
|
promise.resolve(null)
|
|
39
29
|
}
|
|
40
30
|
|
|
41
31
|
@ReactMethod
|
|
42
|
-
fun getCredential(username: String?, promise: Promise) {
|
|
32
|
+
override fun getCredential(username: String?, promise: Promise) {
|
|
43
33
|
launch(promise) {
|
|
44
34
|
val response = it.getCredential(username = username)
|
|
45
35
|
|
|
@@ -62,11 +52,20 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
62
52
|
}
|
|
63
53
|
|
|
64
54
|
@ReactMethod
|
|
65
|
-
fun addCredential(
|
|
55
|
+
override fun addCredential(
|
|
66
56
|
token: String?,
|
|
57
|
+
_requireUserAuthentication: Boolean,
|
|
58
|
+
_keychainAccess: String?,
|
|
67
59
|
username: String?,
|
|
60
|
+
appAttestationMap: ReadableMap?,
|
|
68
61
|
promise: Promise
|
|
69
62
|
) {
|
|
63
|
+
val appAttestation = appAttestationMap?.let { map ->
|
|
64
|
+
val attestationToken = map.getString("token") ?: return@let null
|
|
65
|
+
val keyId = if (map.hasKey("keyId")) map.getString("keyId") else null
|
|
66
|
+
AppAttestation(token = attestationToken, keyId = keyId)
|
|
67
|
+
}
|
|
68
|
+
|
|
70
69
|
launch(promise) {
|
|
71
70
|
val response = it.addCredential(
|
|
72
71
|
token = token,
|
|
@@ -75,6 +74,7 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
75
74
|
timeout = 0,
|
|
76
75
|
authorizationType = 0,
|
|
77
76
|
username = username,
|
|
77
|
+
appAttestation = appAttestation,
|
|
78
78
|
)
|
|
79
79
|
|
|
80
80
|
if (response.error != null) {
|
|
@@ -94,7 +94,7 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
@ReactMethod
|
|
97
|
-
fun removeCredential(username: String?, promise: Promise) {
|
|
97
|
+
override fun removeCredential(username: String?, promise: Promise) {
|
|
98
98
|
launch(promise) {
|
|
99
99
|
val response = it.removeCredential(username = username)
|
|
100
100
|
|
|
@@ -109,7 +109,7 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
@ReactMethod
|
|
112
|
-
fun verify(
|
|
112
|
+
override fun verify(
|
|
113
113
|
action: String?,
|
|
114
114
|
username: String?,
|
|
115
115
|
promise: Promise
|
|
@@ -122,19 +122,23 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
122
122
|
|
|
123
123
|
promise.reject(errorCode, response.error)
|
|
124
124
|
} else {
|
|
125
|
-
val data = response.data
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
125
|
+
val data = response.data
|
|
126
|
+
if (data != null) {
|
|
127
|
+
val map = Arguments.createMap()
|
|
128
|
+
map.putString("token", data.token)
|
|
129
|
+
map.putString("userId", data.userId)
|
|
130
|
+
map.putString("userAuthenticatorId", data.userAuthenticatorId)
|
|
131
|
+
map.putString("username", data.username)
|
|
132
|
+
promise.resolve(map)
|
|
133
|
+
} else {
|
|
134
|
+
promise.reject(defaultError, "No data returned")
|
|
135
|
+
}
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
138
|
}
|
|
135
139
|
|
|
136
140
|
@ReactMethod
|
|
137
|
-
fun createPin(pin: String, username: String, token: String?, promise: Promise) {
|
|
141
|
+
override fun createPin(pin: String, username: String, token: String?, promise: Promise) {
|
|
138
142
|
launch(promise) {
|
|
139
143
|
val response = it.createPin(
|
|
140
144
|
pin = pin,
|
|
@@ -147,19 +151,23 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
147
151
|
|
|
148
152
|
promise.reject(errorCode, response.error)
|
|
149
153
|
} else {
|
|
150
|
-
val data = response.data
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
val data = response.data
|
|
155
|
+
if (data != null) {
|
|
156
|
+
val map = Arguments.createMap()
|
|
157
|
+
map.putString("credentialId", data.credentialId)
|
|
158
|
+
map.putString("createdAt", data.createdAt)
|
|
159
|
+
map.putString("userId", data.userId)
|
|
160
|
+
map.putString("lastAuthenticatedAt", data.lastAuthenticatedAt)
|
|
161
|
+
promise.resolve(map)
|
|
162
|
+
} else {
|
|
163
|
+
promise.reject(defaultError, "No data returned")
|
|
164
|
+
}
|
|
157
165
|
}
|
|
158
166
|
}
|
|
159
167
|
}
|
|
160
168
|
|
|
161
169
|
@ReactMethod
|
|
162
|
-
fun verifyPin(pin: String, username: String, action: String?, promise: Promise) {
|
|
170
|
+
override fun verifyPin(pin: String, username: String, action: String?, promise: Promise) {
|
|
163
171
|
launch(promise) {
|
|
164
172
|
val response = it.verifyPin(
|
|
165
173
|
pin = pin,
|
|
@@ -172,18 +180,22 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
172
180
|
|
|
173
181
|
promise.reject(errorCode, response.error)
|
|
174
182
|
} else {
|
|
175
|
-
val data = response.data
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
183
|
+
val data = response.data
|
|
184
|
+
if (data != null) {
|
|
185
|
+
val map = Arguments.createMap()
|
|
186
|
+
map.putBoolean("isVerified", data.isVerified)
|
|
187
|
+
map.putString("token", data.token)
|
|
188
|
+
map.putString("userId", data.userId)
|
|
189
|
+
promise.resolve(map)
|
|
190
|
+
} else {
|
|
191
|
+
promise.reject(defaultError, "No data returned")
|
|
192
|
+
}
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
195
|
}
|
|
184
196
|
|
|
185
197
|
@ReactMethod
|
|
186
|
-
fun deletePin(username: String, promise: Promise) {
|
|
198
|
+
override fun deletePin(username: String, promise: Promise) {
|
|
187
199
|
launch(promise) {
|
|
188
200
|
val response = it.deletePin(username = username)
|
|
189
201
|
|
|
@@ -198,7 +210,7 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
198
210
|
}
|
|
199
211
|
|
|
200
212
|
@ReactMethod
|
|
201
|
-
fun getAllPinUsernames(promise: Promise) {
|
|
213
|
+
override fun getAllPinUsernames(promise: Promise) {
|
|
202
214
|
launch(promise) {
|
|
203
215
|
val response = it.getAllPinUsernames()
|
|
204
216
|
|
|
@@ -225,4 +237,8 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
|
|
|
225
237
|
}
|
|
226
238
|
}
|
|
227
239
|
}
|
|
240
|
+
|
|
241
|
+
companion object {
|
|
242
|
+
const val NAME = "AuthsignalInAppModule"
|
|
243
|
+
}
|
|
228
244
|
}
|
|
@@ -7,61 +7,49 @@ import android.net.Uri
|
|
|
7
7
|
import com.authsignal.TokenCache.Companion.shared
|
|
8
8
|
import com.authsignal.react.AuthenticationActivity.Companion.authenticateUsingBrowser
|
|
9
9
|
import com.facebook.react.bridge.ActivityEventListener
|
|
10
|
-
import com.facebook.react.bridge.Arguments
|
|
11
|
-
import com.facebook.react.bridge.Callback
|
|
12
10
|
import com.facebook.react.bridge.Promise
|
|
13
11
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
14
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
15
12
|
import com.facebook.react.bridge.ReactMethod
|
|
13
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
16
14
|
import java.net.URLDecoder
|
|
17
15
|
|
|
16
|
+
@ReactModule(name = AuthsignalModule.NAME)
|
|
18
17
|
class AuthsignalModule(private val reactContext: ReactApplicationContext) :
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
), ActivityEventListener {
|
|
22
|
-
private var callback: Callback? = null
|
|
18
|
+
NativeAuthsignalModuleSpec(reactContext), ActivityEventListener {
|
|
19
|
+
private var launchPromise: Promise? = null
|
|
23
20
|
|
|
24
21
|
init {
|
|
25
22
|
reactContext.addActivityEventListener(this)
|
|
26
23
|
}
|
|
27
24
|
|
|
28
|
-
override fun getConstants(): Map<String, Any>? {
|
|
29
|
-
val constants: MutableMap<String, Any> = HashMap()
|
|
30
|
-
constants["bundleIdentifier"] = reactContext.applicationInfo.packageName
|
|
31
|
-
return constants
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
override fun getName(): String {
|
|
35
|
-
return "AuthsignalModule"
|
|
36
|
-
}
|
|
37
|
-
|
|
38
25
|
@ReactMethod
|
|
39
|
-
fun setToken(token: String?, promise: Promise) {
|
|
26
|
+
override fun setToken(token: String?, promise: Promise) {
|
|
40
27
|
shared.token = token
|
|
41
28
|
|
|
42
29
|
promise.resolve("token_set")
|
|
43
30
|
}
|
|
44
31
|
|
|
45
32
|
@ReactMethod
|
|
46
|
-
fun launch(url: String?,
|
|
33
|
+
override fun launch(url: String?, promise: Promise) {
|
|
34
|
+
if (url == null) {
|
|
35
|
+
promise.reject("invalid_url", "Launch URL must not be null.")
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
47
39
|
val activity = reactContext.currentActivity
|
|
48
40
|
val parsedUrl = Uri.parse(url)
|
|
49
|
-
this.
|
|
41
|
+
this.launchPromise = promise
|
|
50
42
|
|
|
51
43
|
try {
|
|
52
44
|
if (activity != null) {
|
|
53
45
|
authenticateUsingBrowser(activity, parsedUrl)
|
|
54
46
|
} else {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
error.putString("error_description", "Android Activity is null.")
|
|
58
|
-
callback.invoke(error)
|
|
47
|
+
promise.reject("activity_not_available", "Android Activity is null.")
|
|
48
|
+
this.launchPromise = null
|
|
59
49
|
}
|
|
60
50
|
} catch (e: ActivityNotFoundException) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
error.putString("error_description", "No browser app is installed")
|
|
64
|
-
callback.invoke(error)
|
|
51
|
+
promise.reject("browser_not_available", "No browser app is installed")
|
|
52
|
+
this.launchPromise = null
|
|
65
53
|
}
|
|
66
54
|
}
|
|
67
55
|
|
|
@@ -71,7 +59,7 @@ class AuthsignalModule(private val reactContext: ReactApplicationContext) :
|
|
|
71
59
|
resultCode: Int,
|
|
72
60
|
data: Intent?
|
|
73
61
|
) {
|
|
74
|
-
val
|
|
62
|
+
val pendingPromise = this@AuthsignalModule.launchPromise ?: return
|
|
75
63
|
|
|
76
64
|
val hasResult =
|
|
77
65
|
resultCode == Activity.RESULT_OK && requestCode == AuthenticationActivity.AUTHENTICATION_REQUEST && data!!.data != null
|
|
@@ -93,23 +81,21 @@ class AuthsignalModule(private val reactContext: ReactApplicationContext) :
|
|
|
93
81
|
shared.token = value
|
|
94
82
|
}
|
|
95
83
|
}
|
|
96
|
-
|
|
84
|
+
pendingPromise.resolve(token)
|
|
97
85
|
} catch (ex: Exception) {
|
|
98
|
-
|
|
99
|
-
error.putString("error", "malformed_url")
|
|
100
|
-
error.putString("error_description", "Malformed redirect url")
|
|
101
|
-
cb.invoke(error)
|
|
86
|
+
pendingPromise.reject("malformed_url", "Malformed redirect url")
|
|
102
87
|
}
|
|
103
88
|
} else {
|
|
104
|
-
|
|
105
|
-
error.putString("error", "user_cancelled")
|
|
106
|
-
error.putString("error_description", "User cancelled")
|
|
107
|
-
cb.invoke(error)
|
|
89
|
+
pendingPromise.resolve(null)
|
|
108
90
|
}
|
|
109
91
|
|
|
110
|
-
this@AuthsignalModule.
|
|
92
|
+
this@AuthsignalModule.launchPromise = null
|
|
111
93
|
}
|
|
112
94
|
|
|
113
95
|
override fun onNewIntent(intent: Intent) {
|
|
114
96
|
}
|
|
97
|
+
|
|
98
|
+
companion object {
|
|
99
|
+
const val NAME = "AuthsignalModule"
|
|
100
|
+
}
|
|
115
101
|
}
|
|
@@ -1,26 +1,79 @@
|
|
|
1
1
|
package com.authsignal.react
|
|
2
2
|
|
|
3
|
-
import com.facebook.react.
|
|
3
|
+
import com.facebook.react.TurboReactPackage
|
|
4
4
|
import com.facebook.react.bridge.NativeModule
|
|
5
5
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
-
import com.facebook.react.
|
|
6
|
+
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
7
8
|
|
|
8
|
-
class AuthsignalPackage :
|
|
9
|
-
override fun
|
|
10
|
-
return
|
|
11
|
-
AuthsignalModule(reactContext)
|
|
12
|
-
AuthsignalEmailModule(reactContext)
|
|
13
|
-
AuthsignalPasskeyModule(reactContext)
|
|
14
|
-
AuthsignalPushModule(reactContext)
|
|
15
|
-
AuthsignalInAppModule(reactContext)
|
|
16
|
-
AuthsignalQRCodeModule(reactContext)
|
|
17
|
-
AuthsignalSMSModule(reactContext)
|
|
18
|
-
AuthsignalTOTPModule(reactContext)
|
|
19
|
-
AuthsignalWhatsappModule(reactContext)
|
|
20
|
-
|
|
9
|
+
class AuthsignalPackage : TurboReactPackage() {
|
|
10
|
+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
11
|
+
return when (name) {
|
|
12
|
+
AuthsignalModule.NAME -> AuthsignalModule(reactContext)
|
|
13
|
+
AuthsignalEmailModule.NAME -> AuthsignalEmailModule(reactContext)
|
|
14
|
+
AuthsignalPasskeyModule.NAME -> AuthsignalPasskeyModule(reactContext)
|
|
15
|
+
AuthsignalPushModule.NAME -> AuthsignalPushModule(reactContext)
|
|
16
|
+
AuthsignalInAppModule.NAME -> AuthsignalInAppModule(reactContext)
|
|
17
|
+
AuthsignalQRCodeModule.NAME -> AuthsignalQRCodeModule(reactContext)
|
|
18
|
+
AuthsignalSMSModule.NAME -> AuthsignalSMSModule(reactContext)
|
|
19
|
+
AuthsignalTOTPModule.NAME -> AuthsignalTOTPModule(reactContext)
|
|
20
|
+
AuthsignalWhatsappModule.NAME -> AuthsignalWhatsappModule(reactContext)
|
|
21
|
+
else -> null
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
26
|
+
return ReactModuleInfoProvider {
|
|
27
|
+
mapOf(
|
|
28
|
+
AuthsignalModule.NAME to createModuleInfo(
|
|
29
|
+
AuthsignalModule.NAME,
|
|
30
|
+
AuthsignalModule::class.java.name
|
|
31
|
+
),
|
|
32
|
+
AuthsignalEmailModule.NAME to createModuleInfo(
|
|
33
|
+
AuthsignalEmailModule.NAME,
|
|
34
|
+
AuthsignalEmailModule::class.java.name
|
|
35
|
+
),
|
|
36
|
+
AuthsignalPasskeyModule.NAME to createModuleInfo(
|
|
37
|
+
AuthsignalPasskeyModule.NAME,
|
|
38
|
+
AuthsignalPasskeyModule::class.java.name
|
|
39
|
+
),
|
|
40
|
+
AuthsignalPushModule.NAME to createModuleInfo(
|
|
41
|
+
AuthsignalPushModule.NAME,
|
|
42
|
+
AuthsignalPushModule::class.java.name
|
|
43
|
+
),
|
|
44
|
+
AuthsignalInAppModule.NAME to createModuleInfo(
|
|
45
|
+
AuthsignalInAppModule.NAME,
|
|
46
|
+
AuthsignalInAppModule::class.java.name
|
|
47
|
+
),
|
|
48
|
+
AuthsignalQRCodeModule.NAME to createModuleInfo(
|
|
49
|
+
AuthsignalQRCodeModule.NAME,
|
|
50
|
+
AuthsignalQRCodeModule::class.java.name
|
|
51
|
+
),
|
|
52
|
+
AuthsignalSMSModule.NAME to createModuleInfo(
|
|
53
|
+
AuthsignalSMSModule.NAME,
|
|
54
|
+
AuthsignalSMSModule::class.java.name
|
|
55
|
+
),
|
|
56
|
+
AuthsignalTOTPModule.NAME to createModuleInfo(
|
|
57
|
+
AuthsignalTOTPModule.NAME,
|
|
58
|
+
AuthsignalTOTPModule::class.java.name
|
|
59
|
+
),
|
|
60
|
+
AuthsignalWhatsappModule.NAME to createModuleInfo(
|
|
61
|
+
AuthsignalWhatsappModule.NAME,
|
|
62
|
+
AuthsignalWhatsappModule::class.java.name
|
|
63
|
+
),
|
|
64
|
+
)
|
|
65
|
+
}
|
|
21
66
|
}
|
|
22
67
|
|
|
23
|
-
|
|
24
|
-
return
|
|
68
|
+
private fun createModuleInfo(name: String, className: String): ReactModuleInfo {
|
|
69
|
+
return ReactModuleInfo(
|
|
70
|
+
name,
|
|
71
|
+
className,
|
|
72
|
+
false,
|
|
73
|
+
false,
|
|
74
|
+
false,
|
|
75
|
+
false,
|
|
76
|
+
true,
|
|
77
|
+
)
|
|
25
78
|
}
|
|
26
79
|
}
|
|
@@ -5,31 +5,22 @@ import com.authsignal.passkey.AuthsignalPasskey
|
|
|
5
5
|
import com.facebook.react.bridge.Arguments
|
|
6
6
|
import com.facebook.react.bridge.Promise
|
|
7
7
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
-
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
9
8
|
import com.facebook.react.bridge.ReactMethod
|
|
9
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
10
10
|
import kotlinx.coroutines.CoroutineScope
|
|
11
11
|
import kotlinx.coroutines.Dispatchers
|
|
12
12
|
import kotlinx.coroutines.SupervisorJob
|
|
13
13
|
import kotlinx.coroutines.launch
|
|
14
14
|
|
|
15
|
+
@ReactModule(name = AuthsignalPasskeyModule.NAME)
|
|
15
16
|
class AuthsignalPasskeyModule(private val reactContext: ReactApplicationContext) :
|
|
16
|
-
|
|
17
|
+
NativeAuthsignalPasskeyModuleSpec(reactContext) {
|
|
17
18
|
private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
|
18
19
|
private var authsignal: AuthsignalPasskey? = null
|
|
19
20
|
private var defaultError = "unexpected_error"
|
|
20
21
|
|
|
21
|
-
override fun getConstants(): Map<String, Any>? {
|
|
22
|
-
val constants: MutableMap<String, Any> = HashMap()
|
|
23
|
-
constants["bundleIdentifier"] = reactContext.applicationInfo.packageName
|
|
24
|
-
return constants
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
override fun getName(): String {
|
|
28
|
-
return "AuthsignalPasskeyModule"
|
|
29
|
-
}
|
|
30
|
-
|
|
31
22
|
@ReactMethod
|
|
32
|
-
fun initialize(tenantID: String, baseURL: String, deviceID: String?, promise: Promise) {
|
|
23
|
+
override fun initialize(tenantID: String, baseURL: String, deviceID: String?, promise: Promise) {
|
|
33
24
|
val activity = reactContext.currentActivity
|
|
34
25
|
|
|
35
26
|
if (activity != null) {
|
|
@@ -40,7 +31,7 @@ class AuthsignalPasskeyModule(private val reactContext: ReactApplicationContext)
|
|
|
40
31
|
}
|
|
41
32
|
|
|
42
33
|
@ReactMethod
|
|
43
|
-
fun signUp(token: String?, username: String?, displayName: String?, ignorePasskeyAlreadyExistsError: Boolean, promise: Promise) {
|
|
34
|
+
override fun signUp(token: String?, username: String?, displayName: String?, ignorePasskeyAlreadyExistsError: Boolean, promise: Promise) {
|
|
44
35
|
launch(promise) {
|
|
45
36
|
val response = it.signUp(token, username, displayName, false, ignorePasskeyAlreadyExistsError)
|
|
46
37
|
|
|
@@ -61,7 +52,13 @@ class AuthsignalPasskeyModule(private val reactContext: ReactApplicationContext)
|
|
|
61
52
|
}
|
|
62
53
|
|
|
63
54
|
@ReactMethod
|
|
64
|
-
fun signIn(
|
|
55
|
+
override fun signIn(
|
|
56
|
+
action: String?,
|
|
57
|
+
token: String?,
|
|
58
|
+
_autofill: Boolean,
|
|
59
|
+
preferImmediatelyAvailableCredentials: Boolean,
|
|
60
|
+
promise: Promise
|
|
61
|
+
) {
|
|
65
62
|
launch(promise) {
|
|
66
63
|
val response = it.signIn(action, token, preferImmediatelyAvailableCredentials)
|
|
67
64
|
|
|
@@ -84,7 +81,12 @@ class AuthsignalPasskeyModule(private val reactContext: ReactApplicationContext)
|
|
|
84
81
|
}
|
|
85
82
|
|
|
86
83
|
@ReactMethod
|
|
87
|
-
fun
|
|
84
|
+
override fun cancel() {
|
|
85
|
+
// No-op on Android; cancel is only applicable for iOS autofill
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@ReactMethod
|
|
89
|
+
override fun shouldPromptToCreatePasskey(username: String?, promise: Promise) {
|
|
88
90
|
launch(promise) {
|
|
89
91
|
val response = it.shouldPromptToCreatePasskey(username)
|
|
90
92
|
|
|
@@ -93,7 +95,7 @@ class AuthsignalPasskeyModule(private val reactContext: ReactApplicationContext)
|
|
|
93
95
|
}
|
|
94
96
|
|
|
95
97
|
@ReactMethod
|
|
96
|
-
fun isAvailableOnDevice(promise: Promise) {
|
|
98
|
+
override fun isAvailableOnDevice(promise: Promise) {
|
|
97
99
|
launch(promise) {
|
|
98
100
|
val response = it.isAvailableOnDevice()
|
|
99
101
|
|
|
@@ -112,4 +114,8 @@ class AuthsignalPasskeyModule(private val reactContext: ReactApplicationContext)
|
|
|
112
114
|
}
|
|
113
115
|
}
|
|
114
116
|
}
|
|
117
|
+
|
|
118
|
+
companion object {
|
|
119
|
+
const val NAME = "AuthsignalPasskeyModule"
|
|
120
|
+
}
|
|
115
121
|
}
|