react-native-authsignal 0.4.4 → 1.0.0
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 +2 -3
- package/android/gradle/wrapper/gradle-wrapper.properties +2 -1
- package/android/gradle.properties +2 -2
- package/android/src/main/java/com/authsignal/react/AuthsignalEmailModule.java +133 -0
- package/android/src/main/java/com/authsignal/react/AuthsignalModule.java +10 -2
- package/android/src/main/java/com/authsignal/react/AuthsignalPackage.java +4 -1
- package/android/src/main/java/com/authsignal/react/AuthsignalPasskeyModule.java +18 -8
- package/android/src/main/java/com/authsignal/react/AuthsignalPushModule.java +3 -1
- package/android/src/main/java/com/authsignal/react/AuthsignalSMSModule.java +133 -0
- package/android/src/main/java/com/authsignal/react/AuthsignalTOTPModule.java +112 -0
- package/ios/Authsignal.xcodeproj/project.pbxproj +16 -4
- package/ios/AuthsignalEmailModule.m +22 -0
- package/ios/AuthsignalEmailModule.swift +109 -0
- package/ios/AuthsignalModule.m +9 -63
- package/ios/AuthsignalModule.swift +87 -0
- package/ios/AuthsignalPasskeyModule.m +1 -1
- package/ios/AuthsignalPasskeyModule.swift +11 -9
- package/ios/AuthsignalPushModule.m +1 -1
- package/ios/AuthsignalPushModule.swift +9 -7
- package/ios/AuthsignalSMSModule.m +22 -0
- package/ios/AuthsignalSMSModule.swift +109 -0
- package/ios/AuthsignalTOTPModule.m +18 -0
- package/ios/AuthsignalTOTPModule.swift +82 -0
- package/lib/commonjs/email.js +80 -0
- package/lib/commonjs/email.js.map +1 -0
- package/lib/commonjs/error.js +19 -0
- package/lib/commonjs/error.js.map +1 -1
- package/lib/commonjs/index.js +27 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/passkey.js +20 -10
- package/lib/commonjs/passkey.js.map +1 -1
- package/lib/commonjs/sms.js +80 -0
- package/lib/commonjs/sms.js.map +1 -0
- package/lib/commonjs/totp.js +68 -0
- package/lib/commonjs/totp.js.map +1 -0
- package/lib/module/email.js +73 -0
- package/lib/module/email.js.map +1 -0
- package/lib/module/error.js +18 -0
- package/lib/module/error.js.map +1 -1
- package/lib/module/index.js +27 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/passkey.js +20 -10
- package/lib/module/passkey.js.map +1 -1
- package/lib/module/sms.js +73 -0
- package/lib/module/sms.js.map +1 -0
- package/lib/module/totp.js +61 -0
- package/lib/module/totp.js.map +1 -0
- package/lib/typescript/email.d.ts +22 -0
- package/lib/typescript/email.d.ts.map +1 -0
- package/lib/typescript/error.d.ts +11 -1
- package/lib/typescript/error.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +8 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/passkey.d.ts +3 -3
- package/lib/typescript/passkey.d.ts.map +1 -1
- package/lib/typescript/sms.d.ts +22 -0
- package/lib/typescript/sms.d.ts.map +1 -0
- package/lib/typescript/totp.d.ts +22 -0
- package/lib/typescript/totp.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +10 -2
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native-authsignal.podspec +1 -1
- package/src/email.ts +94 -0
- package/src/error.ts +20 -0
- package/src/index.tsx +17 -0
- package/src/passkey.ts +17 -9
- package/src/sms.ts +96 -0
- package/src/totp.ts +83 -0
- package/src/types.ts +12 -2
- package/yarn.lock +109 -83
- package/ios/AuthsignalModule.h +0 -11
package/android/build.gradle
CHANGED
|
@@ -5,7 +5,7 @@ buildscript {
|
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
dependencies {
|
|
8
|
-
classpath 'com.android.tools.build:gradle:4.2
|
|
8
|
+
classpath 'com.android.tools.build:gradle:7.4.2'
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
|
|
@@ -129,8 +129,7 @@ dependencies {
|
|
|
129
129
|
|
|
130
130
|
implementation "androidx.browser:browser:1.2.0"
|
|
131
131
|
|
|
132
|
-
implementation("com.authsignal:authsignal-
|
|
133
|
-
implementation("com.authsignal:authsignal-passkey-android:0.2.1")
|
|
132
|
+
implementation("com.authsignal:authsignal-android:1.0.4")
|
|
134
133
|
}
|
|
135
134
|
|
|
136
135
|
if (isNewArchitectureEnabled()) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
#Fri Aug 16 14:14:32 NZST 2024
|
|
1
2
|
distributionBase=GRADLE_USER_HOME
|
|
2
3
|
distributionPath=wrapper/dists
|
|
3
|
-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.
|
|
4
|
+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
|
|
4
5
|
zipStoreBase=GRADLE_USER_HOME
|
|
5
6
|
zipStorePath=wrapper/dists
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
package com.authsignal.react;
|
|
2
|
+
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.util.Log;
|
|
5
|
+
|
|
6
|
+
import androidx.annotation.NonNull;
|
|
7
|
+
|
|
8
|
+
import com.authsignal.email.AuthsignalEmail;
|
|
9
|
+
import com.authsignal.models.*;
|
|
10
|
+
import com.facebook.react.bridge.Arguments;
|
|
11
|
+
import com.facebook.react.bridge.Promise;
|
|
12
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
13
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
14
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
15
|
+
import com.facebook.react.bridge.WritableMap;
|
|
16
|
+
|
|
17
|
+
import java.util.HashMap;
|
|
18
|
+
import java.util.Map;
|
|
19
|
+
|
|
20
|
+
public class AuthsignalEmailModule extends ReactContextBaseJavaModule {
|
|
21
|
+
private final ReactApplicationContext reactContext;
|
|
22
|
+
|
|
23
|
+
private AuthsignalEmail authsignalEmail;
|
|
24
|
+
|
|
25
|
+
private final String TAG = "AuthsignalEmailModule";
|
|
26
|
+
private final String INIT_WARNING = "AuthsignalEmailModule is not initialized.";
|
|
27
|
+
|
|
28
|
+
public AuthsignalEmailModule(ReactApplicationContext reactContext) {
|
|
29
|
+
super(reactContext);
|
|
30
|
+
this.reactContext = reactContext;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@Override
|
|
34
|
+
public Map<String, Object> getConstants() {
|
|
35
|
+
final Map<String, Object> constants = new HashMap<>();
|
|
36
|
+
constants.put("bundleIdentifier", reactContext.getApplicationInfo().packageName);
|
|
37
|
+
return constants;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@NonNull
|
|
41
|
+
@Override
|
|
42
|
+
public String getName() {
|
|
43
|
+
return "AuthsignalEmailModule";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@ReactMethod
|
|
47
|
+
public void initialize(String tenantID, String baseURL, Promise promise) {
|
|
48
|
+
Activity currentActivity = reactContext.getCurrentActivity();
|
|
49
|
+
|
|
50
|
+
if (currentActivity != null) {
|
|
51
|
+
authsignalEmail = new AuthsignalEmail(
|
|
52
|
+
tenantID,
|
|
53
|
+
baseURL
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
promise.resolve(null);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@ReactMethod
|
|
61
|
+
public void enroll(String email, Promise promise) {
|
|
62
|
+
if (authsignalEmail != null) {
|
|
63
|
+
authsignalEmail
|
|
64
|
+
.enrollAsync(email)
|
|
65
|
+
.thenAcceptAsync(response -> {
|
|
66
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
67
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
68
|
+
} else if (response.getError() != null) {
|
|
69
|
+
promise.reject("enrollError", response.getError());
|
|
70
|
+
} else {
|
|
71
|
+
EnrollResponse enrollResponse = response.getData();
|
|
72
|
+
WritableMap map = Arguments.createMap();
|
|
73
|
+
map.putString("userAuthenticatorId", enrollResponse.getUserAuthenticatorId());
|
|
74
|
+
promise.resolve(map);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
Log.w(TAG, INIT_WARNING);
|
|
79
|
+
|
|
80
|
+
promise.resolve(null);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@ReactMethod
|
|
85
|
+
public void challenge(Promise promise) {
|
|
86
|
+
if (authsignalEmail != null) {
|
|
87
|
+
authsignalEmail
|
|
88
|
+
.challengeAsync()
|
|
89
|
+
.thenAcceptAsync(response -> {
|
|
90
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
91
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
92
|
+
} else if (response.getError() != null) {
|
|
93
|
+
promise.reject("challengeError", response.getError());
|
|
94
|
+
} else {
|
|
95
|
+
ChallengeResponse challengeResponse = response.getData();
|
|
96
|
+
WritableMap map = Arguments.createMap();
|
|
97
|
+
map.putString("challengeId", challengeResponse.getChallengeId());
|
|
98
|
+
promise.resolve(map);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
} else {
|
|
102
|
+
Log.w(TAG, INIT_WARNING);
|
|
103
|
+
|
|
104
|
+
promise.resolve(null);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@ReactMethod
|
|
109
|
+
public void verify(String code, Promise promise) {
|
|
110
|
+
if (authsignalEmail != null) {
|
|
111
|
+
authsignalEmail
|
|
112
|
+
.verifyAsync(code)
|
|
113
|
+
.thenAcceptAsync(response -> {
|
|
114
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
115
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
116
|
+
} else if (response.getError() != null) {
|
|
117
|
+
promise.reject("verifyError", response.getError());
|
|
118
|
+
} else {
|
|
119
|
+
VerifyResponse verifyResponse = response.getData();
|
|
120
|
+
WritableMap map = Arguments.createMap();
|
|
121
|
+
map.putBoolean("isVerified", verifyResponse.isVerified());
|
|
122
|
+
map.putString("token", verifyResponse.getToken());
|
|
123
|
+
map.putString("failureReason", verifyResponse.getFailureReason());
|
|
124
|
+
promise.resolve(map);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
} else {
|
|
128
|
+
Log.w(TAG, INIT_WARNING);
|
|
129
|
+
|
|
130
|
+
promise.resolve(null);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -6,6 +6,7 @@ import android.content.ActivityNotFoundException;
|
|
|
6
6
|
import android.net.Uri;
|
|
7
7
|
import androidx.annotation.NonNull;
|
|
8
8
|
|
|
9
|
+
import com.authsignal.TokenCache;
|
|
9
10
|
import com.facebook.react.bridge.ActivityEventListener;
|
|
10
11
|
import com.facebook.react.bridge.Arguments;
|
|
11
12
|
import com.facebook.react.bridge.Callback;
|
|
@@ -14,11 +15,9 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
|
14
15
|
import com.facebook.react.bridge.ReactMethod;
|
|
15
16
|
import com.facebook.react.bridge.WritableMap;
|
|
16
17
|
|
|
17
|
-
import java.net.URL;
|
|
18
18
|
import java.net.URLDecoder;
|
|
19
19
|
import java.util.HashMap;
|
|
20
20
|
import java.util.Map;
|
|
21
|
-
import java.util.Objects;
|
|
22
21
|
|
|
23
22
|
import static android.app.Activity.RESULT_OK;
|
|
24
23
|
|
|
@@ -45,6 +44,13 @@ public class AuthsignalModule extends ReactContextBaseJavaModule implements Acti
|
|
|
45
44
|
return "AuthsignalModule";
|
|
46
45
|
}
|
|
47
46
|
|
|
47
|
+
@ReactMethod
|
|
48
|
+
public void setToken(String token, Callback callback) {
|
|
49
|
+
TokenCache.Companion.getShared().setToken(token);
|
|
50
|
+
|
|
51
|
+
callback.invoke(null, "token_set");
|
|
52
|
+
}
|
|
53
|
+
|
|
48
54
|
@ReactMethod
|
|
49
55
|
public void launch(String url, Callback callback) {
|
|
50
56
|
final Activity activity = getCurrentActivity();
|
|
@@ -92,6 +98,8 @@ public class AuthsignalModule extends ReactContextBaseJavaModule implements Acti
|
|
|
92
98
|
String value = URLDecoder.decode(pair.substring(index + 1), "UTF-8");
|
|
93
99
|
if (name.equals("token")) {
|
|
94
100
|
token = value;
|
|
101
|
+
|
|
102
|
+
TokenCache.Companion.getShared().setToken(value);
|
|
95
103
|
}
|
|
96
104
|
}
|
|
97
105
|
cb.invoke(null, token);
|
|
@@ -14,8 +14,11 @@ public class AuthsignalPackage implements ReactPackage {
|
|
|
14
14
|
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
|
15
15
|
return Arrays.asList(
|
|
16
16
|
new AuthsignalModule(reactContext),
|
|
17
|
+
new AuthsignalEmailModule(reactContext),
|
|
17
18
|
new AuthsignalPasskeyModule(reactContext),
|
|
18
|
-
new AuthsignalPushModule(reactContext)
|
|
19
|
+
new AuthsignalPushModule(reactContext),
|
|
20
|
+
new AuthsignalSMSModule(reactContext),
|
|
21
|
+
new AuthsignalTOTPModule(reactContext)
|
|
19
22
|
);
|
|
20
23
|
}
|
|
21
24
|
|
|
@@ -60,13 +60,15 @@ public class AuthsignalPasskeyModule extends ReactContextBaseJavaModule {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
@ReactMethod
|
|
63
|
-
public void signUp(String token, String
|
|
63
|
+
public void signUp(String token, String username, String displayName, Promise promise) {
|
|
64
64
|
if (authsignalPasskey != null) {
|
|
65
65
|
authsignalPasskey
|
|
66
|
-
.signUpAsync(token,
|
|
66
|
+
.signUpAsync(token, username, displayName)
|
|
67
67
|
.thenAcceptAsync(response -> {
|
|
68
|
-
if (response.
|
|
69
|
-
promise.reject("
|
|
68
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
69
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
70
|
+
} else if (response.getError() != null) {
|
|
71
|
+
promise.reject("signUpError", response.getError());
|
|
70
72
|
} else {
|
|
71
73
|
SignUpResponse signUpResponse = response.getData();
|
|
72
74
|
WritableMap map = Arguments.createMap();
|
|
@@ -87,8 +89,16 @@ public class AuthsignalPasskeyModule extends ReactContextBaseJavaModule {
|
|
|
87
89
|
authsignalPasskey
|
|
88
90
|
.signInAsync(action, token)
|
|
89
91
|
.thenAcceptAsync(response -> {
|
|
90
|
-
if (response.
|
|
91
|
-
|
|
92
|
+
if (response.getErrorType() != null) {
|
|
93
|
+
if (response.getErrorType().equals("android.credentials.GetCredentialException.TYPE_NO_CREDENTIAL")) {
|
|
94
|
+
promise.reject("signInNoCredential", "SIGN_IN_NO_CREDENTIAL");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (response.getErrorType().equals("android.credentials.GetCredentialException.TYPE_USER_CANCELED")) {
|
|
98
|
+
promise.reject("signInCanceled", "SIGN_IN_CANCELED");
|
|
99
|
+
}
|
|
100
|
+
} else if (response.getError() != null) {
|
|
101
|
+
promise.reject("signInError", response.getError());
|
|
92
102
|
} else {
|
|
93
103
|
SignInResponse signInResponse = response.getData();
|
|
94
104
|
WritableMap map = Arguments.createMap();
|
|
@@ -96,8 +106,8 @@ public class AuthsignalPasskeyModule extends ReactContextBaseJavaModule {
|
|
|
96
106
|
map.putString("token", signInResponse.getToken());
|
|
97
107
|
map.putString("userId", signInResponse.getUserId());
|
|
98
108
|
map.putString("userAuthenticatorId", signInResponse.getUserAuthenticatorId());
|
|
99
|
-
map.putString("
|
|
100
|
-
map.putString("
|
|
109
|
+
map.putString("username", signInResponse.getUsername());
|
|
110
|
+
map.putString("displayName", signInResponse.getDisplayName());
|
|
101
111
|
promise.resolve(map);
|
|
102
112
|
}
|
|
103
113
|
});
|
|
@@ -79,7 +79,9 @@ public class AuthsignalPushModule extends ReactContextBaseJavaModule {
|
|
|
79
79
|
authsignalPush
|
|
80
80
|
.addCredentialAsync(token, null)
|
|
81
81
|
.thenAcceptAsync(response -> {
|
|
82
|
-
if (response.
|
|
82
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
83
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
84
|
+
} else if (response.getError() != null) {
|
|
83
85
|
promise.reject("addCredential error", response.getError());
|
|
84
86
|
} else {
|
|
85
87
|
promise.resolve(response.getData());
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
package com.authsignal.react;
|
|
2
|
+
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.util.Log;
|
|
5
|
+
|
|
6
|
+
import androidx.annotation.NonNull;
|
|
7
|
+
|
|
8
|
+
import com.authsignal.sms.AuthsignalSMS;
|
|
9
|
+
import com.authsignal.models.*;
|
|
10
|
+
import com.facebook.react.bridge.Arguments;
|
|
11
|
+
import com.facebook.react.bridge.Promise;
|
|
12
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
13
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
14
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
15
|
+
import com.facebook.react.bridge.WritableMap;
|
|
16
|
+
|
|
17
|
+
import java.util.HashMap;
|
|
18
|
+
import java.util.Map;
|
|
19
|
+
|
|
20
|
+
public class AuthsignalSMSModule extends ReactContextBaseJavaModule {
|
|
21
|
+
private final ReactApplicationContext reactContext;
|
|
22
|
+
|
|
23
|
+
private AuthsignalSMS authsignalSMS;
|
|
24
|
+
|
|
25
|
+
private final String TAG = "AuthsignalSMSModule";
|
|
26
|
+
private final String INIT_WARNING = "AuthsignalSMSModule is not initialized.";
|
|
27
|
+
|
|
28
|
+
public AuthsignalSMSModule(ReactApplicationContext reactContext) {
|
|
29
|
+
super(reactContext);
|
|
30
|
+
this.reactContext = reactContext;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@Override
|
|
34
|
+
public Map<String, Object> getConstants() {
|
|
35
|
+
final Map<String, Object> constants = new HashMap<>();
|
|
36
|
+
constants.put("bundleIdentifier", reactContext.getApplicationInfo().packageName);
|
|
37
|
+
return constants;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@NonNull
|
|
41
|
+
@Override
|
|
42
|
+
public String getName() {
|
|
43
|
+
return "AuthsignalSMSModule";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@ReactMethod
|
|
47
|
+
public void initialize(String tenantID, String baseURL, Promise promise) {
|
|
48
|
+
Activity currentActivity = reactContext.getCurrentActivity();
|
|
49
|
+
|
|
50
|
+
if (currentActivity != null) {
|
|
51
|
+
authsignalSMS = new AuthsignalSMS(
|
|
52
|
+
tenantID,
|
|
53
|
+
baseURL
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
promise.resolve(null);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@ReactMethod
|
|
61
|
+
public void enroll(String phoneNumber, Promise promise) {
|
|
62
|
+
if (authsignalSMS != null) {
|
|
63
|
+
authsignalSMS
|
|
64
|
+
.enrollAsync(phoneNumber)
|
|
65
|
+
.thenAcceptAsync(response -> {
|
|
66
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
67
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
68
|
+
} else if (response.getError() != null) {
|
|
69
|
+
promise.reject("enrollError", response.getError());
|
|
70
|
+
} else {
|
|
71
|
+
EnrollResponse enrollResponse = response.getData();
|
|
72
|
+
WritableMap map = Arguments.createMap();
|
|
73
|
+
map.putString("userAuthenticatorId", enrollResponse.getUserAuthenticatorId());
|
|
74
|
+
promise.resolve(map);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
Log.w(TAG, INIT_WARNING);
|
|
79
|
+
|
|
80
|
+
promise.resolve(null);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@ReactMethod
|
|
85
|
+
public void challenge(Promise promise) {
|
|
86
|
+
if (authsignalSMS != null) {
|
|
87
|
+
authsignalSMS
|
|
88
|
+
.challengeAsync()
|
|
89
|
+
.thenAcceptAsync(response -> {
|
|
90
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
91
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
92
|
+
} else if (response.getError() != null) {
|
|
93
|
+
promise.reject("challengeError", response.getError());
|
|
94
|
+
} else {
|
|
95
|
+
ChallengeResponse challengeResponse = response.getData();
|
|
96
|
+
WritableMap map = Arguments.createMap();
|
|
97
|
+
map.putString("challengeId", challengeResponse.getChallengeId());
|
|
98
|
+
promise.resolve(map);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
} else {
|
|
102
|
+
Log.w(TAG, INIT_WARNING);
|
|
103
|
+
|
|
104
|
+
promise.resolve(null);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@ReactMethod
|
|
109
|
+
public void verify(String code, Promise promise) {
|
|
110
|
+
if (authsignalSMS != null) {
|
|
111
|
+
authsignalSMS
|
|
112
|
+
.verifyAsync(code)
|
|
113
|
+
.thenAcceptAsync(response -> {
|
|
114
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
115
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
116
|
+
} else if (response.getError() != null) {
|
|
117
|
+
promise.reject("verifyError", response.getError());
|
|
118
|
+
} else {
|
|
119
|
+
VerifyResponse verifyResponse = response.getData();
|
|
120
|
+
WritableMap map = Arguments.createMap();
|
|
121
|
+
map.putBoolean("isVerified", verifyResponse.isVerified());
|
|
122
|
+
map.putString("token", verifyResponse.getToken());
|
|
123
|
+
map.putString("failureReason", verifyResponse.getFailureReason());
|
|
124
|
+
promise.resolve(map);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
} else {
|
|
128
|
+
Log.w(TAG, INIT_WARNING);
|
|
129
|
+
|
|
130
|
+
promise.resolve(null);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
package com.authsignal.react;
|
|
2
|
+
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.util.Log;
|
|
5
|
+
|
|
6
|
+
import androidx.annotation.NonNull;
|
|
7
|
+
|
|
8
|
+
import com.authsignal.totp.AuthsignalTOTP;
|
|
9
|
+
import com.authsignal.models.*;
|
|
10
|
+
import com.authsignal.totp.api.models.*;
|
|
11
|
+
import com.facebook.react.bridge.Arguments;
|
|
12
|
+
import com.facebook.react.bridge.Promise;
|
|
13
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
14
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
15
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
16
|
+
import com.facebook.react.bridge.WritableMap;
|
|
17
|
+
|
|
18
|
+
import java.util.HashMap;
|
|
19
|
+
import java.util.Map;
|
|
20
|
+
|
|
21
|
+
public class AuthsignalTOTPModule extends ReactContextBaseJavaModule {
|
|
22
|
+
private final ReactApplicationContext reactContext;
|
|
23
|
+
|
|
24
|
+
private AuthsignalTOTP authsignalTOTP;
|
|
25
|
+
|
|
26
|
+
private final String TAG = "AuthsignalTOTPModule";
|
|
27
|
+
private final String INIT_WARNING = "AuthsignalTOTPModule is not initialized.";
|
|
28
|
+
|
|
29
|
+
public AuthsignalTOTPModule(ReactApplicationContext reactContext) {
|
|
30
|
+
super(reactContext);
|
|
31
|
+
this.reactContext = reactContext;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@Override
|
|
35
|
+
public Map<String, Object> getConstants() {
|
|
36
|
+
final Map<String, Object> constants = new HashMap<>();
|
|
37
|
+
constants.put("bundleIdentifier", reactContext.getApplicationInfo().packageName);
|
|
38
|
+
return constants;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@NonNull
|
|
42
|
+
@Override
|
|
43
|
+
public String getName() {
|
|
44
|
+
return "AuthsignalTOTPModule";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@ReactMethod
|
|
48
|
+
public void initialize(String tenantID, String baseURL, Promise promise) {
|
|
49
|
+
Activity currentActivity = reactContext.getCurrentActivity();
|
|
50
|
+
|
|
51
|
+
if (currentActivity != null) {
|
|
52
|
+
authsignalTOTP = new AuthsignalTOTP(
|
|
53
|
+
tenantID,
|
|
54
|
+
baseURL
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
promise.resolve(null);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@ReactMethod
|
|
62
|
+
public void enroll(Promise promise) {
|
|
63
|
+
if (authsignalTOTP != null) {
|
|
64
|
+
authsignalTOTP
|
|
65
|
+
.enrollAsync()
|
|
66
|
+
.thenAcceptAsync(response -> {
|
|
67
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
68
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
69
|
+
} else if (response.getError() != null) {
|
|
70
|
+
promise.reject("enrollError", response.getError());
|
|
71
|
+
} else {
|
|
72
|
+
EnrollTOTPResponse enrollResponse = response.getData();
|
|
73
|
+
WritableMap map = Arguments.createMap();
|
|
74
|
+
map.putString("userAuthenticatorId", enrollResponse.getUserAuthenticatorId());
|
|
75
|
+
map.putString("uri", enrollResponse.getUri());
|
|
76
|
+
map.putString("secret", enrollResponse.getSecret());
|
|
77
|
+
promise.resolve(map);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
Log.w(TAG, INIT_WARNING);
|
|
82
|
+
|
|
83
|
+
promise.resolve(null);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@ReactMethod
|
|
88
|
+
public void verify(String code, Promise promise) {
|
|
89
|
+
if (authsignalTOTP != null) {
|
|
90
|
+
authsignalTOTP
|
|
91
|
+
.verifyAsync(code)
|
|
92
|
+
.thenAcceptAsync(response -> {
|
|
93
|
+
if (response.getErrorType() != null && response.getErrorType().equals("TYPE_TOKEN_NOT_SET")) {
|
|
94
|
+
promise.reject("tokenNotSetError", "TOKEN_NOT_SET");
|
|
95
|
+
} else if (response.getError() != null) {
|
|
96
|
+
promise.reject("verifyError", response.getError());
|
|
97
|
+
} else {
|
|
98
|
+
VerifyResponse verifyResponse = response.getData();
|
|
99
|
+
WritableMap map = Arguments.createMap();
|
|
100
|
+
map.putBoolean("isVerified", verifyResponse.isVerified());
|
|
101
|
+
map.putString("token", verifyResponse.getToken());
|
|
102
|
+
map.putString("failureReason", verifyResponse.getFailureReason());
|
|
103
|
+
promise.resolve(map);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
} else {
|
|
107
|
+
Log.w(TAG, INIT_WARNING);
|
|
108
|
+
|
|
109
|
+
promise.resolve(null);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -20,8 +20,14 @@
|
|
|
20
20
|
|
|
21
21
|
/* Begin PBXFileReference section */
|
|
22
22
|
134814201AA4EA6300B7C361 /* libAuthsignal.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAuthsignal.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
D8AE39E42C729A88003759EB /* AuthsignalEmailModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalEmailModule.m; sourceTree = "<group>"; };
|
|
24
|
+
D8AE39E52C729A88003759EB /* AuthsignalSMSModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalSMSModule.swift; sourceTree = "<group>"; };
|
|
25
|
+
D8AE39E62C729A88003759EB /* AuthsignalTOTPModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalTOTPModule.m; sourceTree = "<group>"; };
|
|
26
|
+
D8AE39E72C729A88003759EB /* AuthsignalEmailModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalEmailModule.swift; sourceTree = "<group>"; };
|
|
27
|
+
D8AE39E82C729A88003759EB /* AuthsignalTOTPModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalTOTPModule.swift; sourceTree = "<group>"; };
|
|
28
|
+
D8AE39E92C729A88003759EB /* AuthsignalSMSModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalSMSModule.m; sourceTree = "<group>"; };
|
|
29
|
+
D8AE39EA2C729B67003759EB /* AuthsignalModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalModule.swift; sourceTree = "<group>"; };
|
|
30
|
+
D8AE39EB2C729BF4003759EB /* AuthsignalModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalModule.m; sourceTree = "<group>"; };
|
|
25
31
|
D8EC5CD32A4D1EE00085B442 /* AuthsignalPasskeyModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalPasskeyModule.swift; sourceTree = "<group>"; };
|
|
26
32
|
D8EC5CD42A4D1EE00085B442 /* AuthsignalPushModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalPushModule.swift; sourceTree = "<group>"; };
|
|
27
33
|
D8EC5CD52A4D1EE00085B442 /* AuthsignalPushModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalPushModule.m; sourceTree = "<group>"; };
|
|
@@ -51,13 +57,19 @@
|
|
|
51
57
|
58B511D21A9E6C8500147676 = {
|
|
52
58
|
isa = PBXGroup;
|
|
53
59
|
children = (
|
|
60
|
+
D8AE39EB2C729BF4003759EB /* AuthsignalModule.m */,
|
|
61
|
+
D8AE39EA2C729B67003759EB /* AuthsignalModule.swift */,
|
|
62
|
+
D8AE39E42C729A88003759EB /* AuthsignalEmailModule.m */,
|
|
63
|
+
D8AE39E72C729A88003759EB /* AuthsignalEmailModule.swift */,
|
|
64
|
+
D8AE39E92C729A88003759EB /* AuthsignalSMSModule.m */,
|
|
65
|
+
D8AE39E52C729A88003759EB /* AuthsignalSMSModule.swift */,
|
|
66
|
+
D8AE39E62C729A88003759EB /* AuthsignalTOTPModule.m */,
|
|
67
|
+
D8AE39E82C729A88003759EB /* AuthsignalTOTPModule.swift */,
|
|
54
68
|
D8EC5CD72A4D1EE90085B442 /* Authsignal-Bridging-Header.h */,
|
|
55
69
|
D8EC5CD62A4D1EE00085B442 /* AuthsignalPasskeyModule.m */,
|
|
56
70
|
D8EC5CD32A4D1EE00085B442 /* AuthsignalPasskeyModule.swift */,
|
|
57
71
|
D8EC5CD52A4D1EE00085B442 /* AuthsignalPushModule.m */,
|
|
58
72
|
D8EC5CD42A4D1EE00085B442 /* AuthsignalPushModule.swift */,
|
|
59
|
-
D8CCAF332908C7A30040E0F0 /* AuthsignalModule.h */,
|
|
60
|
-
B3E7B5891CC2AC0600A0062D /* AuthsignalModule.m */,
|
|
61
73
|
134814211AA4EA7D00B7C361 /* Products */,
|
|
62
74
|
);
|
|
63
75
|
sourceTree = "<group>";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
@interface RCT_EXTERN_MODULE(AuthsignalEmailModule, 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(enroll:(NSString)email
|
|
12
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
13
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
14
|
+
|
|
15
|
+
RCT_EXTERN_METHOD(challenge:(RCTPromiseResolveBlock)resolve
|
|
16
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
17
|
+
|
|
18
|
+
RCT_EXTERN_METHOD(verify:(NSString)code
|
|
19
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
20
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
21
|
+
|
|
22
|
+
@end
|