react-native-credentials-manager 0.3.0 → 0.4.1
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/README.md +64 -2
- package/android/build.gradle +1 -11
- package/android/generated/java/com/credentialsmanager/NativeCredentialsManagerSpec.java +8 -0
- package/android/generated/jni/RNCredentialsManagerSpec-generated.cpp +12 -0
- package/android/generated/jni/react/renderer/components/RNCredentialsManagerSpec/RNCredentialsManagerSpecJSI-generated.cpp +13 -0
- package/android/generated/jni/react/renderer/components/RNCredentialsManagerSpec/RNCredentialsManagerSpecJSI.h +118 -0
- package/android/src/main/java/com/credentialsmanager/handlers/CredentialHandler.kt +89 -2
- package/android/src/main/java/com/credentialsmanager/handlers/ErrorHandler.kt +20 -0
- package/android/src/newarch/java/com/credentialsmanager/CredentialsManagerModule.kt +69 -2
- package/android/src/oldarch/java/com/credentialsmanager/CredentialsManagerModule.kt +68 -2
- package/ios/generated/RNCredentialsManagerSpec/RNCredentialsManagerSpec-generated.mm +20 -0
- package/ios/generated/RNCredentialsManagerSpec/RNCredentialsManagerSpec.h +37 -0
- package/ios/generated/RNCredentialsManagerSpecJSI-generated.cpp +13 -0
- package/ios/generated/RNCredentialsManagerSpecJSI.h +118 -0
- package/lib/commonjs/NativeCredentialsManager.js.map +1 -1
- package/lib/commonjs/index.js +12 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/NativeCredentialsManager.js.map +1 -1
- package/lib/module/index.js +10 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/src/NativeCredentialsManager.d.ts +16 -0
- package/lib/typescript/commonjs/src/NativeCredentialsManager.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +7 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/NativeCredentialsManager.d.ts +16 -0
- package/lib/typescript/module/src/NativeCredentialsManager.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +7 -1
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/package.json +15 -3
- package/src/NativeCredentialsManager.ts +17 -0
- package/src/index.tsx +17 -1
package/README.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# react-native-credentials-manager
|
|
2
2
|
|
|
3
|
+
> 📚 **Documentation has moved!** The complete documentation is now available at [https://docs.benjamineruvieru.com/docs/react-native-credentials-manager/](https://docs.benjamineruvieru.com/docs/react-native-credentials-manager/)
|
|
4
|
+
|
|
3
5
|
A React Native library that implements the [Credential Manager API](https://developer.android.com/identity/sign-in/credential-manager) for Android. This library allows you to manage passwords and passkeys in your React Native applications.
|
|
4
6
|
|
|
5
|
-
> ⚠️ **Note**: This library is actively under development. iOS support using Authentication Services is coming soon. ~~Support for the old React Native architecture is also in progress.~~ Supports old architecture now. Google Sign-In integration with Credential Manager will be added shortly.
|
|
7
|
+
> ⚠️ **Note**: This library is actively under development. iOS support using Authentication Services is coming soon. ~~Support for the old React Native architecture is also in progress.~~ Supports old architecture now. ~~Google Sign-In integration with Credential Manager will be added shortly.~~ Google Sign-In is now supported.
|
|
6
8
|
|
|
7
9
|
## Features
|
|
8
10
|
|
|
9
11
|
- ✨ Passkey Authentication
|
|
10
12
|
- 🔐 Password Credential Management
|
|
11
|
-
- 📱 Google Signing
|
|
13
|
+
- 📱 Google Signing
|
|
12
14
|
- 🤖 [iOS Authentication Services](https://developer.apple.com/documentation/authenticationservices?language=objc) (coming soon)
|
|
13
15
|
|
|
14
16
|
## Installation
|
|
@@ -225,6 +227,66 @@ try {
|
|
|
225
227
|
}
|
|
226
228
|
```
|
|
227
229
|
|
|
230
|
+
### [Google Sign-In](https://developer.android.com/identity/sign-in/credential-manager-siwg#instantiate-google)
|
|
231
|
+
|
|
232
|
+
**Function**: `signInWithGoogle(params)`
|
|
233
|
+
|
|
234
|
+
**Description**: Authenticates users using Google Sign-In through the Credential Manager.
|
|
235
|
+
|
|
236
|
+
**Parameters**:
|
|
237
|
+
|
|
238
|
+
| Parameter | Type | Description |
|
|
239
|
+
| ------------------- | --------- | --------------------------------------------------------------------------- |
|
|
240
|
+
| `serverClientId` | `string` | Your application's web client ID from the Google Cloud Console |
|
|
241
|
+
| `nonce` | `string?` | Optional nonce for additional security |
|
|
242
|
+
| `autoSelectEnabled` | `boolean` | Whether to automatically select the Google account if only one is available |
|
|
243
|
+
|
|
244
|
+
**Example**:
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
import { signInWithGoogle } from 'react-native-credentials-manager';
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
const credential = await signInWithGoogle({
|
|
251
|
+
serverClientId: 'YOUR_WEB_CLIENT_ID',
|
|
252
|
+
autoSelectEnabled: true,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
if (credential.type === 'google-signin') {
|
|
256
|
+
console.log('Google credentials:', {
|
|
257
|
+
id: credential.id,
|
|
258
|
+
idToken: credential.idToken,
|
|
259
|
+
displayName: credential.displayName,
|
|
260
|
+
familyName: credential.familyName,
|
|
261
|
+
givenName: credential.givenName,
|
|
262
|
+
profilePicture: credential.profilePicture,
|
|
263
|
+
phoneNumber: credential.phoneNumber,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
} catch (error) {
|
|
267
|
+
console.error('Google Sign-In failed:', error);
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Sign Out
|
|
272
|
+
|
|
273
|
+
Function : signOut()
|
|
274
|
+
|
|
275
|
+
Description : Signs out the current user and clears credentials.
|
|
276
|
+
|
|
277
|
+
Example :
|
|
278
|
+
|
|
279
|
+
```typescript
|
|
280
|
+
import { signOut } from 'react-native-credentials-manager';
|
|
281
|
+
|
|
282
|
+
try {
|
|
283
|
+
await signOut();
|
|
284
|
+
console.log('Successfully signed out');
|
|
285
|
+
} catch (error) {
|
|
286
|
+
console.error('Sign out failed:', error);
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
228
290
|
## Documentation
|
|
229
291
|
|
|
230
292
|
For more detailed information about the underlying APIs, refer to:
|
package/android/build.gradle
CHANGED
|
@@ -88,17 +88,6 @@ android {
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
-
|
|
92
|
-
// sourceSets {
|
|
93
|
-
// main {
|
|
94
|
-
// if (isNewArchitectureEnabled()) {
|
|
95
|
-
// java.srcDirs += [
|
|
96
|
-
// "generated/java",
|
|
97
|
-
// "generated/jni"
|
|
98
|
-
// ]
|
|
99
|
-
// }
|
|
100
|
-
// }
|
|
101
|
-
// }
|
|
102
91
|
}
|
|
103
92
|
|
|
104
93
|
repositories {
|
|
@@ -115,6 +104,7 @@ dependencies {
|
|
|
115
104
|
implementation "androidx.credentials:credentials-play-services-auth:1.5.0-rc01"
|
|
116
105
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4"
|
|
117
106
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
|
|
107
|
+
implementation "com.google.android.libraries.identity.googleid:googleid:1.1.1"
|
|
118
108
|
}
|
|
119
109
|
|
|
120
110
|
if (isNewArchitectureEnabled()) {
|
|
@@ -44,4 +44,12 @@ public abstract class NativeCredentialsManagerSpec extends ReactContextBaseJavaM
|
|
|
44
44
|
@ReactMethod
|
|
45
45
|
@DoNotStrip
|
|
46
46
|
public abstract void signInWithSavedCredentials(ReadableMap requestJson, Promise promise);
|
|
47
|
+
|
|
48
|
+
@ReactMethod
|
|
49
|
+
@DoNotStrip
|
|
50
|
+
public abstract void signInWithGoogle(ReadableMap params, Promise promise);
|
|
51
|
+
|
|
52
|
+
@ReactMethod
|
|
53
|
+
@DoNotStrip
|
|
54
|
+
public abstract void signOut(Promise promise);
|
|
47
55
|
}
|
|
@@ -27,11 +27,23 @@ static facebook::jsi::Value __hostFunction_NativeCredentialsManagerSpecJSI_signI
|
|
|
27
27
|
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithSavedCredentials", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
static facebook::jsi::Value __hostFunction_NativeCredentialsManagerSpecJSI_signInWithGoogle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
31
|
+
static jmethodID cachedMethodId = nullptr;
|
|
32
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithGoogle", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static facebook::jsi::Value __hostFunction_NativeCredentialsManagerSpecJSI_signOut(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
36
|
+
static jmethodID cachedMethodId = nullptr;
|
|
37
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "signOut", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
|
|
38
|
+
}
|
|
39
|
+
|
|
30
40
|
NativeCredentialsManagerSpecJSI::NativeCredentialsManagerSpecJSI(const JavaTurboModule::InitParams ¶ms)
|
|
31
41
|
: JavaTurboModule(params) {
|
|
32
42
|
methodMap_["signUpWithPasskeys"] = MethodMetadata {2, __hostFunction_NativeCredentialsManagerSpecJSI_signUpWithPasskeys};
|
|
33
43
|
methodMap_["signUpWithPassword"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerSpecJSI_signUpWithPassword};
|
|
34
44
|
methodMap_["signInWithSavedCredentials"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerSpecJSI_signInWithSavedCredentials};
|
|
45
|
+
methodMap_["signInWithGoogle"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerSpecJSI_signInWithGoogle};
|
|
46
|
+
methodMap_["signOut"] = MethodMetadata {0, __hostFunction_NativeCredentialsManagerSpecJSI_signOut};
|
|
35
47
|
}
|
|
36
48
|
|
|
37
49
|
std::shared_ptr<TurboModule> RNCredentialsManagerSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) {
|
|
@@ -31,12 +31,25 @@ static jsi::Value __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithSa
|
|
|
31
31
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt)
|
|
32
32
|
);
|
|
33
33
|
}
|
|
34
|
+
static jsi::Value __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithGoogle(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
35
|
+
return static_cast<NativeCredentialsManagerCxxSpecJSI *>(&turboModule)->signInWithGoogle(
|
|
36
|
+
rt,
|
|
37
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt)
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
static jsi::Value __hostFunction_NativeCredentialsManagerCxxSpecJSI_signOut(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
41
|
+
return static_cast<NativeCredentialsManagerCxxSpecJSI *>(&turboModule)->signOut(
|
|
42
|
+
rt
|
|
43
|
+
);
|
|
44
|
+
}
|
|
34
45
|
|
|
35
46
|
NativeCredentialsManagerCxxSpecJSI::NativeCredentialsManagerCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
36
47
|
: TurboModule("CredentialsManager", jsInvoker) {
|
|
37
48
|
methodMap_["signUpWithPasskeys"] = MethodMetadata {2, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signUpWithPasskeys};
|
|
38
49
|
methodMap_["signUpWithPassword"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signUpWithPassword};
|
|
39
50
|
methodMap_["signInWithSavedCredentials"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithSavedCredentials};
|
|
51
|
+
methodMap_["signInWithGoogle"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithGoogle};
|
|
52
|
+
methodMap_["signOut"] = MethodMetadata {0, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signOut};
|
|
40
53
|
}
|
|
41
54
|
|
|
42
55
|
|
|
@@ -62,6 +62,106 @@ struct NativeCredentialsManagerCredObjectBridging {
|
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
#pragma mark - NativeCredentialsManagerGoogleCredential
|
|
68
|
+
|
|
69
|
+
template <typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
|
|
70
|
+
struct NativeCredentialsManagerGoogleCredential {
|
|
71
|
+
P0 type;
|
|
72
|
+
P1 id;
|
|
73
|
+
P2 idToken;
|
|
74
|
+
P3 displayName;
|
|
75
|
+
P4 familyName;
|
|
76
|
+
P5 givenName;
|
|
77
|
+
P6 profilePicture;
|
|
78
|
+
P7 phoneNumber;
|
|
79
|
+
bool operator==(const NativeCredentialsManagerGoogleCredential &other) const {
|
|
80
|
+
return type == other.type && id == other.id && idToken == other.idToken && displayName == other.displayName && familyName == other.familyName && givenName == other.givenName && profilePicture == other.profilePicture && phoneNumber == other.phoneNumber;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
template <typename T>
|
|
85
|
+
struct NativeCredentialsManagerGoogleCredentialBridging {
|
|
86
|
+
static T types;
|
|
87
|
+
|
|
88
|
+
static T fromJs(
|
|
89
|
+
jsi::Runtime &rt,
|
|
90
|
+
const jsi::Object &value,
|
|
91
|
+
const std::shared_ptr<CallInvoker> &jsInvoker) {
|
|
92
|
+
T result{
|
|
93
|
+
bridging::fromJs<decltype(types.type)>(rt, value.getProperty(rt, "type"), jsInvoker),
|
|
94
|
+
bridging::fromJs<decltype(types.id)>(rt, value.getProperty(rt, "id"), jsInvoker),
|
|
95
|
+
bridging::fromJs<decltype(types.idToken)>(rt, value.getProperty(rt, "idToken"), jsInvoker),
|
|
96
|
+
bridging::fromJs<decltype(types.displayName)>(rt, value.getProperty(rt, "displayName"), jsInvoker),
|
|
97
|
+
bridging::fromJs<decltype(types.familyName)>(rt, value.getProperty(rt, "familyName"), jsInvoker),
|
|
98
|
+
bridging::fromJs<decltype(types.givenName)>(rt, value.getProperty(rt, "givenName"), jsInvoker),
|
|
99
|
+
bridging::fromJs<decltype(types.profilePicture)>(rt, value.getProperty(rt, "profilePicture"), jsInvoker),
|
|
100
|
+
bridging::fromJs<decltype(types.phoneNumber)>(rt, value.getProperty(rt, "phoneNumber"), jsInvoker)};
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
#ifdef DEBUG
|
|
105
|
+
static jsi::String typeToJs(jsi::Runtime &rt, decltype(types.type) value) {
|
|
106
|
+
return bridging::toJs(rt, value);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static jsi::String idToJs(jsi::Runtime &rt, decltype(types.id) value) {
|
|
110
|
+
return bridging::toJs(rt, value);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static jsi::String idTokenToJs(jsi::Runtime &rt, decltype(types.idToken) value) {
|
|
114
|
+
return bridging::toJs(rt, value);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static jsi::String displayNameToJs(jsi::Runtime &rt, decltype(types.displayName) value) {
|
|
118
|
+
return bridging::toJs(rt, value);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static jsi::String familyNameToJs(jsi::Runtime &rt, decltype(types.familyName) value) {
|
|
122
|
+
return bridging::toJs(rt, value);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static jsi::String givenNameToJs(jsi::Runtime &rt, decltype(types.givenName) value) {
|
|
126
|
+
return bridging::toJs(rt, value);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static jsi::String profilePictureToJs(jsi::Runtime &rt, decltype(types.profilePicture) value) {
|
|
130
|
+
return bridging::toJs(rt, value);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
static jsi::String phoneNumberToJs(jsi::Runtime &rt, decltype(types.phoneNumber) value) {
|
|
134
|
+
return bridging::toJs(rt, value);
|
|
135
|
+
}
|
|
136
|
+
#endif
|
|
137
|
+
|
|
138
|
+
static jsi::Object toJs(
|
|
139
|
+
jsi::Runtime &rt,
|
|
140
|
+
const T &value,
|
|
141
|
+
const std::shared_ptr<CallInvoker> &jsInvoker) {
|
|
142
|
+
auto result = facebook::jsi::Object(rt);
|
|
143
|
+
result.setProperty(rt, "type", bridging::toJs(rt, value.type, jsInvoker));
|
|
144
|
+
result.setProperty(rt, "id", bridging::toJs(rt, value.id, jsInvoker));
|
|
145
|
+
result.setProperty(rt, "idToken", bridging::toJs(rt, value.idToken, jsInvoker));
|
|
146
|
+
if (value.displayName) {
|
|
147
|
+
result.setProperty(rt, "displayName", bridging::toJs(rt, value.displayName.value(), jsInvoker));
|
|
148
|
+
}
|
|
149
|
+
if (value.familyName) {
|
|
150
|
+
result.setProperty(rt, "familyName", bridging::toJs(rt, value.familyName.value(), jsInvoker));
|
|
151
|
+
}
|
|
152
|
+
if (value.givenName) {
|
|
153
|
+
result.setProperty(rt, "givenName", bridging::toJs(rt, value.givenName.value(), jsInvoker));
|
|
154
|
+
}
|
|
155
|
+
if (value.profilePicture) {
|
|
156
|
+
result.setProperty(rt, "profilePicture", bridging::toJs(rt, value.profilePicture.value(), jsInvoker));
|
|
157
|
+
}
|
|
158
|
+
if (value.phoneNumber) {
|
|
159
|
+
result.setProperty(rt, "phoneNumber", bridging::toJs(rt, value.phoneNumber.value(), jsInvoker));
|
|
160
|
+
}
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
65
165
|
class JSI_EXPORT NativeCredentialsManagerCxxSpecJSI : public TurboModule {
|
|
66
166
|
protected:
|
|
67
167
|
NativeCredentialsManagerCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
|
|
@@ -70,6 +170,8 @@ public:
|
|
|
70
170
|
virtual jsi::Value signUpWithPasskeys(jsi::Runtime &rt, jsi::Object requestJson, bool preferImmediatelyAvailableCredentials) = 0;
|
|
71
171
|
virtual void signUpWithPassword(jsi::Runtime &rt, jsi::Object credObject) = 0;
|
|
72
172
|
virtual jsi::Value signInWithSavedCredentials(jsi::Runtime &rt, jsi::Object requestJson) = 0;
|
|
173
|
+
virtual jsi::Value signInWithGoogle(jsi::Runtime &rt, jsi::Object params) = 0;
|
|
174
|
+
virtual jsi::Value signOut(jsi::Runtime &rt) = 0;
|
|
73
175
|
|
|
74
176
|
};
|
|
75
177
|
|
|
@@ -124,6 +226,22 @@ private:
|
|
|
124
226
|
return bridging::callFromJs<jsi::Value>(
|
|
125
227
|
rt, &T::signInWithSavedCredentials, jsInvoker_, instance_, std::move(requestJson));
|
|
126
228
|
}
|
|
229
|
+
jsi::Value signInWithGoogle(jsi::Runtime &rt, jsi::Object params) override {
|
|
230
|
+
static_assert(
|
|
231
|
+
bridging::getParameterCount(&T::signInWithGoogle) == 2,
|
|
232
|
+
"Expected signInWithGoogle(...) to have 2 parameters");
|
|
233
|
+
|
|
234
|
+
return bridging::callFromJs<jsi::Value>(
|
|
235
|
+
rt, &T::signInWithGoogle, jsInvoker_, instance_, std::move(params));
|
|
236
|
+
}
|
|
237
|
+
jsi::Value signOut(jsi::Runtime &rt) override {
|
|
238
|
+
static_assert(
|
|
239
|
+
bridging::getParameterCount(&T::signOut) == 1,
|
|
240
|
+
"Expected signOut(...) to have 1 parameters");
|
|
241
|
+
|
|
242
|
+
return bridging::callFromJs<jsi::Value>(
|
|
243
|
+
rt, &T::signOut, jsInvoker_, instance_);
|
|
244
|
+
}
|
|
127
245
|
|
|
128
246
|
private:
|
|
129
247
|
friend class NativeCredentialsManagerCxxSpec;
|
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
package com.credentialsmanager.handlers
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
|
+
import android.util.Log
|
|
4
5
|
import androidx.credentials.CreatePasswordRequest
|
|
5
6
|
import androidx.credentials.CreatePublicKeyCredentialRequest
|
|
6
7
|
import androidx.credentials.CreatePublicKeyCredentialResponse
|
|
7
8
|
import androidx.credentials.CredentialManager
|
|
9
|
+
import androidx.credentials.CustomCredential
|
|
8
10
|
import androidx.credentials.GetCredentialRequest
|
|
11
|
+
import androidx.credentials.GetCredentialResponse
|
|
9
12
|
import androidx.credentials.GetPasswordOption
|
|
10
13
|
import androidx.credentials.GetPublicKeyCredentialOption
|
|
11
14
|
import androidx.credentials.PasswordCredential
|
|
12
15
|
import androidx.credentials.PublicKeyCredential
|
|
13
16
|
import com.facebook.react.bridge.Arguments
|
|
14
17
|
import com.facebook.react.bridge.ReadableMap
|
|
18
|
+
import com.google.android.libraries.identity.googleid.GetGoogleIdOption
|
|
19
|
+
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
|
|
20
|
+
import com.google.android.libraries.identity.googleid.GoogleIdTokenParsingException
|
|
15
21
|
import org.json.JSONObject
|
|
22
|
+
import androidx.credentials.ClearCredentialStateRequest
|
|
16
23
|
|
|
17
24
|
class CredentialHandler(
|
|
18
25
|
private val context: Context,
|
|
19
26
|
) {
|
|
20
27
|
private val credentialManager = CredentialManager.create(context)
|
|
21
28
|
|
|
29
|
+
suspend fun signOut(){
|
|
30
|
+
|
|
31
|
+
credentialManager.clearCredentialState(ClearCredentialStateRequest())
|
|
32
|
+
|
|
33
|
+
}
|
|
22
34
|
suspend fun createPasskey(
|
|
23
35
|
jsonString: String,
|
|
24
36
|
preferImmediatelyAvailableCredentials: Boolean,
|
|
@@ -69,7 +81,15 @@ class CredentialHandler(
|
|
|
69
81
|
),
|
|
70
82
|
)
|
|
71
83
|
|
|
72
|
-
return
|
|
84
|
+
return handleSignInResult(result)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
fun handleSignInResult(result: GetCredentialResponse): ReadableMap? {
|
|
88
|
+
// Handle the successfully returned credential.
|
|
89
|
+
val credential = result.credential
|
|
90
|
+
Log.d("CredentialManager", "Handle results called")
|
|
91
|
+
|
|
92
|
+
return when (credential) {
|
|
73
93
|
is PublicKeyCredential -> {
|
|
74
94
|
val cred = result.credential as PublicKeyCredential
|
|
75
95
|
Arguments.createMap().apply {
|
|
@@ -85,7 +105,74 @@ class CredentialHandler(
|
|
|
85
105
|
putString("password", cred.password)
|
|
86
106
|
}
|
|
87
107
|
}
|
|
88
|
-
|
|
108
|
+
// GoogleIdToken credential
|
|
109
|
+
is CustomCredential -> {
|
|
110
|
+
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
|
|
111
|
+
try {
|
|
112
|
+
val googleIdTokenCredential =
|
|
113
|
+
GoogleIdTokenCredential
|
|
114
|
+
.createFrom(credential.data)
|
|
115
|
+
Log.d("CredentialManager", "Google ID Token Credential ID: ${googleIdTokenCredential.id}")
|
|
116
|
+
|
|
117
|
+
return Arguments.createMap().apply {
|
|
118
|
+
putString("type", "google-signin")
|
|
119
|
+
putString("id", googleIdTokenCredential.id)
|
|
120
|
+
putString("idToken", googleIdTokenCredential.idToken)
|
|
121
|
+
googleIdTokenCredential.displayName?.let { putString("displayName", it) }
|
|
122
|
+
googleIdTokenCredential.familyName?.let { putString("familyName", it) }
|
|
123
|
+
googleIdTokenCredential.givenName?.let { putString("givenName", it) }
|
|
124
|
+
googleIdTokenCredential.profilePictureUri?.let { putString("profilePicture", it.toString()) }
|
|
125
|
+
googleIdTokenCredential.phoneNumber?.let { putString("phoneNumber", it) }
|
|
126
|
+
}
|
|
127
|
+
} catch (e: GoogleIdTokenParsingException) {
|
|
128
|
+
Log.e("CredentialManager", "Received an invalid google id token response", e)
|
|
129
|
+
return null
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
Log.e("CredentialManager", "Received an unexpected credential type")
|
|
133
|
+
return null
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
else -> {
|
|
138
|
+
// Catch any unrecognized credential type here.
|
|
139
|
+
Log.e("CredentialManager", "Unexpected type of credential")
|
|
140
|
+
return null
|
|
141
|
+
}
|
|
89
142
|
}
|
|
90
143
|
}
|
|
144
|
+
|
|
145
|
+
fun getGoogleId(
|
|
146
|
+
setFilterByAuthorizedAccounts: Boolean,
|
|
147
|
+
nonce: String,
|
|
148
|
+
serverClientId: String,
|
|
149
|
+
autoSelectEnabled: Boolean,
|
|
150
|
+
): GetGoogleIdOption {
|
|
151
|
+
Log.d("CredentialManager", "getGoogleId - setFilterByAuthorizedAccounts: $setFilterByAuthorizedAccounts")
|
|
152
|
+
|
|
153
|
+
return GetGoogleIdOption
|
|
154
|
+
.Builder()
|
|
155
|
+
.setFilterByAuthorizedAccounts(setFilterByAuthorizedAccounts)
|
|
156
|
+
.setServerClientId(serverClientId)
|
|
157
|
+
.setAutoSelectEnabled(autoSelectEnabled)
|
|
158
|
+
.setNonce(nonce)
|
|
159
|
+
.build()
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
suspend fun googleSignInRequest(googleIdOption: GetGoogleIdOption): GetCredentialResponse {
|
|
164
|
+
val request: GetCredentialRequest =
|
|
165
|
+
GetCredentialRequest
|
|
166
|
+
.Builder()
|
|
167
|
+
.addCredentialOption(googleIdOption)
|
|
168
|
+
.build()
|
|
169
|
+
|
|
170
|
+
val result =
|
|
171
|
+
credentialManager.getCredential(
|
|
172
|
+
request = request,
|
|
173
|
+
context = context,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
return result
|
|
177
|
+
}
|
|
91
178
|
}
|
|
@@ -7,6 +7,10 @@ import androidx.credentials.exceptions.CreateCredentialException
|
|
|
7
7
|
import androidx.credentials.exceptions.CreateCredentialInterruptedException
|
|
8
8
|
import androidx.credentials.exceptions.CreateCredentialProviderConfigurationException
|
|
9
9
|
import androidx.credentials.exceptions.CreateCredentialUnknownException
|
|
10
|
+
import androidx.credentials.exceptions.GetCredentialCancellationException
|
|
11
|
+
import androidx.credentials.exceptions.GetCredentialException
|
|
12
|
+
import androidx.credentials.exceptions.GetCredentialInterruptedException
|
|
13
|
+
import androidx.credentials.exceptions.GetCredentialUnknownException
|
|
10
14
|
import androidx.credentials.exceptions.publickeycredential.CreatePublicKeyCredentialDomException
|
|
11
15
|
|
|
12
16
|
object ErrorHandler {
|
|
@@ -33,4 +37,20 @@ object ErrorHandler {
|
|
|
33
37
|
else -> Log.w("CredentialManager", "Unexpected exception type ${e::class.java.name}")
|
|
34
38
|
}
|
|
35
39
|
}
|
|
40
|
+
|
|
41
|
+
fun handleGetCredentialError(e: GetCredentialException) {
|
|
42
|
+
when (e) {
|
|
43
|
+
is GetCredentialCancellationException -> {
|
|
44
|
+
Log.d("CredentialManager", "GetCredentialCancellationException")
|
|
45
|
+
}
|
|
46
|
+
is GetCredentialInterruptedException -> {
|
|
47
|
+
Log.d("CredentialManager", "User interputted")
|
|
48
|
+
}
|
|
49
|
+
is GetCredentialUnknownException -> {
|
|
50
|
+
Log.d("CredentialManager", "Unknown error")
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
else -> Log.w("CredentialManager", "Unexpected exception type ${e::class.java.name}")
|
|
54
|
+
}
|
|
55
|
+
}
|
|
36
56
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
package com.credentialsmanager
|
|
2
|
-
import
|
|
2
|
+
import android.util.Log
|
|
3
3
|
import androidx.credentials.exceptions.CreateCredentialException
|
|
4
|
+
import androidx.credentials.exceptions.GetCredentialException
|
|
5
|
+
import androidx.credentials.exceptions.NoCredentialException
|
|
4
6
|
import com.credentialsmanager.handlers.CredentialHandler
|
|
5
7
|
import com.credentialsmanager.handlers.ErrorHandler
|
|
6
8
|
import com.facebook.react.bridge.Promise
|
|
@@ -9,12 +11,12 @@ import com.facebook.react.bridge.ReadableMap
|
|
|
9
11
|
import kotlinx.coroutines.CoroutineScope
|
|
10
12
|
import kotlinx.coroutines.Dispatchers
|
|
11
13
|
import kotlinx.coroutines.launch
|
|
14
|
+
import androidx.credentials.exceptions.ClearCredentialException
|
|
12
15
|
|
|
13
16
|
class CredentialsManagerModule(
|
|
14
17
|
reactContext: ReactApplicationContext,
|
|
15
18
|
) : NativeCredentialsManagerSpec(reactContext) {
|
|
16
19
|
private val coroutineScope = CoroutineScope(Dispatchers.IO)
|
|
17
|
-
val credentialManager = CredentialManager.create(getReactApplicationContext())
|
|
18
20
|
private val credentialHandler = CredentialHandler(reactContext)
|
|
19
21
|
|
|
20
22
|
private var implementation: CredentialsManagerModuleImpl = CredentialsManagerModuleImpl()
|
|
@@ -68,4 +70,69 @@ class CredentialsManagerModule(
|
|
|
68
70
|
promise.resolve(data)
|
|
69
71
|
}
|
|
70
72
|
}
|
|
73
|
+
|
|
74
|
+
override fun signOut(
|
|
75
|
+
promise: Promise,
|
|
76
|
+
) {
|
|
77
|
+
coroutineScope.launch {
|
|
78
|
+
try {
|
|
79
|
+
credentialHandler.signOut()
|
|
80
|
+
promise.resolve(null)}
|
|
81
|
+
catch (e: ClearCredentialException) {
|
|
82
|
+
Log.e("CredentialManager", "Error during sign out", e)
|
|
83
|
+
promise.reject("ERROR", e.message.toString())
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
override fun signInWithGoogle(
|
|
89
|
+
requestObject: ReadableMap,
|
|
90
|
+
promise: Promise,
|
|
91
|
+
) {
|
|
92
|
+
val nonce = requestObject.getString("nonce") ?: ""
|
|
93
|
+
val serverClientId = requestObject.getString("serverClientId") ?: ""
|
|
94
|
+
val autoSelectEnabled = requestObject.getBoolean("autoSelectEnabled")
|
|
95
|
+
|
|
96
|
+
val googleIdOption =
|
|
97
|
+
credentialHandler.getGoogleId(
|
|
98
|
+
setFilterByAuthorizedAccounts = true,
|
|
99
|
+
nonce = nonce,
|
|
100
|
+
serverClientId = serverClientId,
|
|
101
|
+
autoSelectEnabled = autoSelectEnabled,
|
|
102
|
+
)
|
|
103
|
+
coroutineScope.launch {
|
|
104
|
+
try {
|
|
105
|
+
val result = credentialHandler.googleSignInRequest(googleIdOption)
|
|
106
|
+
val data = credentialHandler.handleSignInResult(result)
|
|
107
|
+
promise.resolve(data)
|
|
108
|
+
} catch (e: GetCredentialException) {
|
|
109
|
+
when (e) {
|
|
110
|
+
is NoCredentialException -> {
|
|
111
|
+
try {
|
|
112
|
+
Log.d("CredentialManager", "NoCredentialException")
|
|
113
|
+
val googleIdOption2 =
|
|
114
|
+
credentialHandler.getGoogleId(
|
|
115
|
+
setFilterByAuthorizedAccounts = false,
|
|
116
|
+
nonce = nonce,
|
|
117
|
+
serverClientId = serverClientId,
|
|
118
|
+
autoSelectEnabled = autoSelectEnabled,
|
|
119
|
+
)
|
|
120
|
+
val result2 = credentialHandler.googleSignInRequest(googleIdOption2)
|
|
121
|
+
val data2 = credentialHandler.handleSignInResult(result2)
|
|
122
|
+
promise.resolve(data2)
|
|
123
|
+
} catch (e2: GetCredentialException) {
|
|
124
|
+
ErrorHandler.handleGetCredentialError(e2)
|
|
125
|
+
Log.e("CredentialManager", "Error during sign in", e2)
|
|
126
|
+
promise.reject("ERROR", e2.message.toString())
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else -> {
|
|
130
|
+
ErrorHandler.handleGetCredentialError(e)
|
|
131
|
+
Log.e("CredentialManager", "Error during sign in", e)
|
|
132
|
+
promise.reject("ERROR", e.message.toString())
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
71
138
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
package com.credentialsmanager
|
|
2
|
-
import androidx.credentials.CredentialManager
|
|
3
2
|
import androidx.credentials.exceptions.CreateCredentialException
|
|
4
3
|
import com.credentialsmanager.handlers.CredentialHandler
|
|
5
4
|
import com.credentialsmanager.handlers.ErrorHandler
|
|
@@ -17,7 +16,6 @@ class CredentialsManagerModule(
|
|
|
17
16
|
reactContext: ReactApplicationContext,
|
|
18
17
|
) : ReactContextBaseJavaModule(reactContext) {
|
|
19
18
|
private val coroutineScope = CoroutineScope(Dispatchers.IO)
|
|
20
|
-
val credentialManager = CredentialManager.create(getReactApplicationContext())
|
|
21
19
|
private val credentialHandler = CredentialHandler(reactContext)
|
|
22
20
|
|
|
23
21
|
private var implementation: CredentialsManagerModuleImpl = CredentialsManagerModuleImpl()
|
|
@@ -74,4 +72,72 @@ class CredentialsManagerModule(
|
|
|
74
72
|
promise.resolve(data)
|
|
75
73
|
}
|
|
76
74
|
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@ReactMethod
|
|
78
|
+
fun signOut(
|
|
79
|
+
promise: Promise,
|
|
80
|
+
) {
|
|
81
|
+
coroutineScope.launch {
|
|
82
|
+
try {
|
|
83
|
+
credentialHandler.signOut()
|
|
84
|
+
promise.resolve(null)}
|
|
85
|
+
catch (e: ClearCredentialException) {
|
|
86
|
+
Log.e("CredentialManager", "Error during sign out", e)
|
|
87
|
+
promise.reject("ERROR", e.message.toString())
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@ReactMethod
|
|
93
|
+
fun signInWithGoogle(
|
|
94
|
+
requestObject: ReadableMap,
|
|
95
|
+
promise: Promise,
|
|
96
|
+
) {
|
|
97
|
+
val nonce = requestObject.getString("nonce") ?: ""
|
|
98
|
+
val serverClientId = requestObject.getString("serverClientId") ?: ""
|
|
99
|
+
val autoSelectEnabled = requestObject.getBoolean("autoSelectEnabled")
|
|
100
|
+
|
|
101
|
+
val googleIdOption =
|
|
102
|
+
credentialHandler.getGoogleId(
|
|
103
|
+
setFilterByAuthorizedAccounts = false,
|
|
104
|
+
nonce = nonce,
|
|
105
|
+
serverClientId = serverClientId,
|
|
106
|
+
autoSelectEnabled = autoSelectEnabled,
|
|
107
|
+
)
|
|
108
|
+
coroutineScope.launch {
|
|
109
|
+
try {
|
|
110
|
+
val result = credentialHandler.googleSignInRequest(googleIdOption)
|
|
111
|
+
val data = credentialHandler.handleSignInResult(result)
|
|
112
|
+
promise.resolve(data)
|
|
113
|
+
} catch (e: GetCredentialException) {
|
|
114
|
+
when (e) {
|
|
115
|
+
is NoCredentialException -> {
|
|
116
|
+
try {
|
|
117
|
+
Log.d("CredentialManager", "NoCredentialException")
|
|
118
|
+
val googleIdOption =
|
|
119
|
+
credentialHandler.getGoogleId(
|
|
120
|
+
setFilterByAuthorizedAccounts = false,
|
|
121
|
+
nonce = nonce,
|
|
122
|
+
serverClientId = serverClientId,
|
|
123
|
+
autoSelectEnabled = autoSelectEnabled,
|
|
124
|
+
)
|
|
125
|
+
val result = credentialHandler.googleSignInRequest(googleIdOption)
|
|
126
|
+
val data = credentialHandler.handleSignInResult(result)
|
|
127
|
+
promise.resolve(data)
|
|
128
|
+
} catch (e: GetCredentialException) {
|
|
129
|
+
ErrorHandler.handleGetCredentialError(e)
|
|
130
|
+
Log.e("CredentialManager", "Error during sign in", e)
|
|
131
|
+
promise.reject("ERROR", e.message.toString())
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else -> {
|
|
135
|
+
ErrorHandler.handleGetCredentialError(e)
|
|
136
|
+
Log.e("CredentialManager", "Error during sign in", e)
|
|
137
|
+
promise.reject("ERROR", e.message.toString())
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
77
143
|
}
|
|
@@ -29,6 +29,12 @@
|
|
|
29
29
|
return facebook::react::managedPointer<JS::NativeCredentialsManager::CredObject>(json);
|
|
30
30
|
}
|
|
31
31
|
@end
|
|
32
|
+
@implementation RCTCxxConvert (NativeCredentialsManager_SpecSignInWithGoogleParams)
|
|
33
|
+
+ (RCTManagedPointer *)JS_NativeCredentialsManager_SpecSignInWithGoogleParams:(id)json
|
|
34
|
+
{
|
|
35
|
+
return facebook::react::managedPointer<JS::NativeCredentialsManager::SpecSignInWithGoogleParams>(json);
|
|
36
|
+
}
|
|
37
|
+
@end
|
|
32
38
|
namespace facebook::react {
|
|
33
39
|
|
|
34
40
|
static facebook::jsi::Value __hostFunction_NativeCredentialsManagerSpecJSI_signUpWithPasskeys(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
@@ -43,6 +49,14 @@ namespace facebook::react {
|
|
|
43
49
|
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithSavedCredentials", @selector(signInWithSavedCredentials:resolve:reject:), args, count);
|
|
44
50
|
}
|
|
45
51
|
|
|
52
|
+
static facebook::jsi::Value __hostFunction_NativeCredentialsManagerSpecJSI_signInWithGoogle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
53
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithGoogle", @selector(signInWithGoogle:resolve:reject:), args, count);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static facebook::jsi::Value __hostFunction_NativeCredentialsManagerSpecJSI_signOut(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
57
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "signOut", @selector(signOut:reject:), args, count);
|
|
58
|
+
}
|
|
59
|
+
|
|
46
60
|
NativeCredentialsManagerSpecJSI::NativeCredentialsManagerSpecJSI(const ObjCTurboModule::InitParams ¶ms)
|
|
47
61
|
: ObjCTurboModule(params) {
|
|
48
62
|
|
|
@@ -54,5 +68,11 @@ namespace facebook::react {
|
|
|
54
68
|
|
|
55
69
|
methodMap_["signInWithSavedCredentials"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerSpecJSI_signInWithSavedCredentials};
|
|
56
70
|
|
|
71
|
+
|
|
72
|
+
methodMap_["signInWithGoogle"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerSpecJSI_signInWithGoogle};
|
|
73
|
+
setMethodArgConversionSelector(@"signInWithGoogle", 0, @"JS_NativeCredentialsManager_SpecSignInWithGoogleParams:");
|
|
74
|
+
|
|
75
|
+
methodMap_["signOut"] = MethodMetadata {0, __hostFunction_NativeCredentialsManagerSpecJSI_signOut};
|
|
76
|
+
|
|
57
77
|
}
|
|
58
78
|
} // namespace facebook::react
|
|
@@ -48,6 +48,23 @@ namespace JS {
|
|
|
48
48
|
@interface RCTCxxConvert (NativeCredentialsManager_CredObject)
|
|
49
49
|
+ (RCTManagedPointer *)JS_NativeCredentialsManager_CredObject:(id)json;
|
|
50
50
|
@end
|
|
51
|
+
namespace JS {
|
|
52
|
+
namespace NativeCredentialsManager {
|
|
53
|
+
struct SpecSignInWithGoogleParams {
|
|
54
|
+
NSString *nonce() const;
|
|
55
|
+
NSString *serverClientId() const;
|
|
56
|
+
bool autoSelectEnabled() const;
|
|
57
|
+
|
|
58
|
+
SpecSignInWithGoogleParams(NSDictionary *const v) : _v(v) {}
|
|
59
|
+
private:
|
|
60
|
+
NSDictionary *_v;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@interface RCTCxxConvert (NativeCredentialsManager_SpecSignInWithGoogleParams)
|
|
66
|
+
+ (RCTManagedPointer *)JS_NativeCredentialsManager_SpecSignInWithGoogleParams:(id)json;
|
|
67
|
+
@end
|
|
51
68
|
@protocol NativeCredentialsManagerSpec <RCTBridgeModule, RCTTurboModule>
|
|
52
69
|
|
|
53
70
|
- (void)signUpWithPasskeys:(NSDictionary *)requestJson
|
|
@@ -58,6 +75,11 @@ preferImmediatelyAvailableCredentials:(BOOL)preferImmediatelyAvailableCredential
|
|
|
58
75
|
- (void)signInWithSavedCredentials:(NSDictionary *)requestJson
|
|
59
76
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
60
77
|
reject:(RCTPromiseRejectBlock)reject;
|
|
78
|
+
- (void)signInWithGoogle:(JS::NativeCredentialsManager::SpecSignInWithGoogleParams &)params
|
|
79
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
80
|
+
reject:(RCTPromiseRejectBlock)reject;
|
|
81
|
+
- (void)signOut:(RCTPromiseResolveBlock)resolve
|
|
82
|
+
reject:(RCTPromiseRejectBlock)reject;
|
|
61
83
|
|
|
62
84
|
@end
|
|
63
85
|
|
|
@@ -89,5 +111,20 @@ inline NSString *JS::NativeCredentialsManager::CredObject::password() const
|
|
|
89
111
|
id const p = _v[@"password"];
|
|
90
112
|
return RCTBridgingToString(p);
|
|
91
113
|
}
|
|
114
|
+
inline NSString *JS::NativeCredentialsManager::SpecSignInWithGoogleParams::nonce() const
|
|
115
|
+
{
|
|
116
|
+
id const p = _v[@"nonce"];
|
|
117
|
+
return RCTBridgingToString(p);
|
|
118
|
+
}
|
|
119
|
+
inline NSString *JS::NativeCredentialsManager::SpecSignInWithGoogleParams::serverClientId() const
|
|
120
|
+
{
|
|
121
|
+
id const p = _v[@"serverClientId"];
|
|
122
|
+
return RCTBridgingToString(p);
|
|
123
|
+
}
|
|
124
|
+
inline bool JS::NativeCredentialsManager::SpecSignInWithGoogleParams::autoSelectEnabled() const
|
|
125
|
+
{
|
|
126
|
+
id const p = _v[@"autoSelectEnabled"];
|
|
127
|
+
return RCTBridgingToBool(p);
|
|
128
|
+
}
|
|
92
129
|
NS_ASSUME_NONNULL_END
|
|
93
130
|
#endif // RNCredentialsManagerSpec_H
|
|
@@ -31,12 +31,25 @@ static jsi::Value __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithSa
|
|
|
31
31
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt)
|
|
32
32
|
);
|
|
33
33
|
}
|
|
34
|
+
static jsi::Value __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithGoogle(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
35
|
+
return static_cast<NativeCredentialsManagerCxxSpecJSI *>(&turboModule)->signInWithGoogle(
|
|
36
|
+
rt,
|
|
37
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt)
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
static jsi::Value __hostFunction_NativeCredentialsManagerCxxSpecJSI_signOut(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
41
|
+
return static_cast<NativeCredentialsManagerCxxSpecJSI *>(&turboModule)->signOut(
|
|
42
|
+
rt
|
|
43
|
+
);
|
|
44
|
+
}
|
|
34
45
|
|
|
35
46
|
NativeCredentialsManagerCxxSpecJSI::NativeCredentialsManagerCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
36
47
|
: TurboModule("CredentialsManager", jsInvoker) {
|
|
37
48
|
methodMap_["signUpWithPasskeys"] = MethodMetadata {2, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signUpWithPasskeys};
|
|
38
49
|
methodMap_["signUpWithPassword"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signUpWithPassword};
|
|
39
50
|
methodMap_["signInWithSavedCredentials"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithSavedCredentials};
|
|
51
|
+
methodMap_["signInWithGoogle"] = MethodMetadata {1, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signInWithGoogle};
|
|
52
|
+
methodMap_["signOut"] = MethodMetadata {0, __hostFunction_NativeCredentialsManagerCxxSpecJSI_signOut};
|
|
40
53
|
}
|
|
41
54
|
|
|
42
55
|
|
|
@@ -62,6 +62,106 @@ struct NativeCredentialsManagerCredObjectBridging {
|
|
|
62
62
|
}
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
#pragma mark - NativeCredentialsManagerGoogleCredential
|
|
68
|
+
|
|
69
|
+
template <typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7>
|
|
70
|
+
struct NativeCredentialsManagerGoogleCredential {
|
|
71
|
+
P0 type;
|
|
72
|
+
P1 id;
|
|
73
|
+
P2 idToken;
|
|
74
|
+
P3 displayName;
|
|
75
|
+
P4 familyName;
|
|
76
|
+
P5 givenName;
|
|
77
|
+
P6 profilePicture;
|
|
78
|
+
P7 phoneNumber;
|
|
79
|
+
bool operator==(const NativeCredentialsManagerGoogleCredential &other) const {
|
|
80
|
+
return type == other.type && id == other.id && idToken == other.idToken && displayName == other.displayName && familyName == other.familyName && givenName == other.givenName && profilePicture == other.profilePicture && phoneNumber == other.phoneNumber;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
template <typename T>
|
|
85
|
+
struct NativeCredentialsManagerGoogleCredentialBridging {
|
|
86
|
+
static T types;
|
|
87
|
+
|
|
88
|
+
static T fromJs(
|
|
89
|
+
jsi::Runtime &rt,
|
|
90
|
+
const jsi::Object &value,
|
|
91
|
+
const std::shared_ptr<CallInvoker> &jsInvoker) {
|
|
92
|
+
T result{
|
|
93
|
+
bridging::fromJs<decltype(types.type)>(rt, value.getProperty(rt, "type"), jsInvoker),
|
|
94
|
+
bridging::fromJs<decltype(types.id)>(rt, value.getProperty(rt, "id"), jsInvoker),
|
|
95
|
+
bridging::fromJs<decltype(types.idToken)>(rt, value.getProperty(rt, "idToken"), jsInvoker),
|
|
96
|
+
bridging::fromJs<decltype(types.displayName)>(rt, value.getProperty(rt, "displayName"), jsInvoker),
|
|
97
|
+
bridging::fromJs<decltype(types.familyName)>(rt, value.getProperty(rt, "familyName"), jsInvoker),
|
|
98
|
+
bridging::fromJs<decltype(types.givenName)>(rt, value.getProperty(rt, "givenName"), jsInvoker),
|
|
99
|
+
bridging::fromJs<decltype(types.profilePicture)>(rt, value.getProperty(rt, "profilePicture"), jsInvoker),
|
|
100
|
+
bridging::fromJs<decltype(types.phoneNumber)>(rt, value.getProperty(rt, "phoneNumber"), jsInvoker)};
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
#ifdef DEBUG
|
|
105
|
+
static jsi::String typeToJs(jsi::Runtime &rt, decltype(types.type) value) {
|
|
106
|
+
return bridging::toJs(rt, value);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static jsi::String idToJs(jsi::Runtime &rt, decltype(types.id) value) {
|
|
110
|
+
return bridging::toJs(rt, value);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static jsi::String idTokenToJs(jsi::Runtime &rt, decltype(types.idToken) value) {
|
|
114
|
+
return bridging::toJs(rt, value);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static jsi::String displayNameToJs(jsi::Runtime &rt, decltype(types.displayName) value) {
|
|
118
|
+
return bridging::toJs(rt, value);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static jsi::String familyNameToJs(jsi::Runtime &rt, decltype(types.familyName) value) {
|
|
122
|
+
return bridging::toJs(rt, value);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static jsi::String givenNameToJs(jsi::Runtime &rt, decltype(types.givenName) value) {
|
|
126
|
+
return bridging::toJs(rt, value);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static jsi::String profilePictureToJs(jsi::Runtime &rt, decltype(types.profilePicture) value) {
|
|
130
|
+
return bridging::toJs(rt, value);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
static jsi::String phoneNumberToJs(jsi::Runtime &rt, decltype(types.phoneNumber) value) {
|
|
134
|
+
return bridging::toJs(rt, value);
|
|
135
|
+
}
|
|
136
|
+
#endif
|
|
137
|
+
|
|
138
|
+
static jsi::Object toJs(
|
|
139
|
+
jsi::Runtime &rt,
|
|
140
|
+
const T &value,
|
|
141
|
+
const std::shared_ptr<CallInvoker> &jsInvoker) {
|
|
142
|
+
auto result = facebook::jsi::Object(rt);
|
|
143
|
+
result.setProperty(rt, "type", bridging::toJs(rt, value.type, jsInvoker));
|
|
144
|
+
result.setProperty(rt, "id", bridging::toJs(rt, value.id, jsInvoker));
|
|
145
|
+
result.setProperty(rt, "idToken", bridging::toJs(rt, value.idToken, jsInvoker));
|
|
146
|
+
if (value.displayName) {
|
|
147
|
+
result.setProperty(rt, "displayName", bridging::toJs(rt, value.displayName.value(), jsInvoker));
|
|
148
|
+
}
|
|
149
|
+
if (value.familyName) {
|
|
150
|
+
result.setProperty(rt, "familyName", bridging::toJs(rt, value.familyName.value(), jsInvoker));
|
|
151
|
+
}
|
|
152
|
+
if (value.givenName) {
|
|
153
|
+
result.setProperty(rt, "givenName", bridging::toJs(rt, value.givenName.value(), jsInvoker));
|
|
154
|
+
}
|
|
155
|
+
if (value.profilePicture) {
|
|
156
|
+
result.setProperty(rt, "profilePicture", bridging::toJs(rt, value.profilePicture.value(), jsInvoker));
|
|
157
|
+
}
|
|
158
|
+
if (value.phoneNumber) {
|
|
159
|
+
result.setProperty(rt, "phoneNumber", bridging::toJs(rt, value.phoneNumber.value(), jsInvoker));
|
|
160
|
+
}
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
65
165
|
class JSI_EXPORT NativeCredentialsManagerCxxSpecJSI : public TurboModule {
|
|
66
166
|
protected:
|
|
67
167
|
NativeCredentialsManagerCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
|
|
@@ -70,6 +170,8 @@ public:
|
|
|
70
170
|
virtual jsi::Value signUpWithPasskeys(jsi::Runtime &rt, jsi::Object requestJson, bool preferImmediatelyAvailableCredentials) = 0;
|
|
71
171
|
virtual void signUpWithPassword(jsi::Runtime &rt, jsi::Object credObject) = 0;
|
|
72
172
|
virtual jsi::Value signInWithSavedCredentials(jsi::Runtime &rt, jsi::Object requestJson) = 0;
|
|
173
|
+
virtual jsi::Value signInWithGoogle(jsi::Runtime &rt, jsi::Object params) = 0;
|
|
174
|
+
virtual jsi::Value signOut(jsi::Runtime &rt) = 0;
|
|
73
175
|
|
|
74
176
|
};
|
|
75
177
|
|
|
@@ -124,6 +226,22 @@ private:
|
|
|
124
226
|
return bridging::callFromJs<jsi::Value>(
|
|
125
227
|
rt, &T::signInWithSavedCredentials, jsInvoker_, instance_, std::move(requestJson));
|
|
126
228
|
}
|
|
229
|
+
jsi::Value signInWithGoogle(jsi::Runtime &rt, jsi::Object params) override {
|
|
230
|
+
static_assert(
|
|
231
|
+
bridging::getParameterCount(&T::signInWithGoogle) == 2,
|
|
232
|
+
"Expected signInWithGoogle(...) to have 2 parameters");
|
|
233
|
+
|
|
234
|
+
return bridging::callFromJs<jsi::Value>(
|
|
235
|
+
rt, &T::signInWithGoogle, jsInvoker_, instance_, std::move(params));
|
|
236
|
+
}
|
|
237
|
+
jsi::Value signOut(jsi::Runtime &rt) override {
|
|
238
|
+
static_assert(
|
|
239
|
+
bridging::getParameterCount(&T::signOut) == 1,
|
|
240
|
+
"Expected signOut(...) to have 1 parameters");
|
|
241
|
+
|
|
242
|
+
return bridging::callFromJs<jsi::Value>(
|
|
243
|
+
rt, &T::signOut, jsInvoker_, instance_);
|
|
244
|
+
}
|
|
127
245
|
|
|
128
246
|
private:
|
|
129
247
|
friend class NativeCredentialsManagerCxxSpec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeCredentialsManager.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeCredentialsManager.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GA+CpCC,gCAAmB,CAACC,YAAY,CAAO,oBAAoB,CAAC","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.signInWithGoogle = signInWithGoogle;
|
|
6
7
|
exports.signInWithSavedCredentials = signInWithSavedCredentials;
|
|
8
|
+
exports.signOut = signOut;
|
|
7
9
|
exports.signUpWithPasskeys = signUpWithPasskeys;
|
|
8
10
|
exports.signUpWithPassword = signUpWithPassword;
|
|
9
11
|
var _NativeCredentialsManager = _interopRequireDefault(require("./NativeCredentialsManager.js"));
|
|
@@ -23,4 +25,14 @@ function signUpWithPassword({
|
|
|
23
25
|
function signInWithSavedCredentials(requestJson) {
|
|
24
26
|
return _NativeCredentialsManager.default.signInWithSavedCredentials(requestJson);
|
|
25
27
|
}
|
|
28
|
+
function signInWithGoogle(params) {
|
|
29
|
+
return _NativeCredentialsManager.default.signInWithGoogle({
|
|
30
|
+
...params,
|
|
31
|
+
nonce: params.nonce ?? '',
|
|
32
|
+
autoSelectEnabled: params.autoSelectEnabled ?? true
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function signOut() {
|
|
36
|
+
return _NativeCredentialsManager.default.signOut();
|
|
37
|
+
}
|
|
26
38
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_NativeCredentialsManager","_interopRequireDefault","require","e","__esModule","default","signUpWithPasskeys","requestJson","preferImmediatelyAvailableCredentials","CredentialsManager","signUpWithPassword","username","password","signInWithSavedCredentials"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_NativeCredentialsManager","_interopRequireDefault","require","e","__esModule","default","signUpWithPasskeys","requestJson","preferImmediatelyAvailableCredentials","CredentialsManager","signUpWithPassword","username","password","signInWithSavedCredentials","signInWithGoogle","params","nonce","autoSelectEnabled","signOut"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;AAAA,IAAAA,yBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA4D,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGrD,SAASG,kBAAkBA,CAChCC,WAAmB,EACnBC,qCAA8C,GAAG,KAAK,EACrC;EACjB,OAAOC,iCAAkB,CAACH,kBAAkB,CAC1CC,WAAW,EACXC,qCACF,CAAC;AACH;AAEO,SAASE,kBAAkBA,CAAC;EACjCC,QAAQ;EACRC;AAIF,CAAC,EAAE;EACDH,iCAAkB,CAACC,kBAAkB,CAAC;IAAEE,QAAQ;IAAED;EAAS,CAAC,CAAC;AAC/D;AAEO,SAASE,0BAA0BA,CACxCN,WAAmB,EACE;EACrB,OAAOE,iCAAkB,CAACI,0BAA0B,CAACN,WAAW,CAAC;AACnE;AAEO,SAASO,gBAAgBA,CAACC,MAIhC,EAA6B;EAC5B,OAAON,iCAAkB,CAACK,gBAAgB,CAAC;IACzC,GAAGC,MAAM;IACTC,KAAK,EAAED,MAAM,CAACC,KAAK,IAAI,EAAE;IACzBC,iBAAiB,EAAEF,MAAM,CAACE,iBAAiB,IAAI;EACjD,CAAC,CAAC;AACJ;AAEO,SAASC,OAAOA,CAAA,EAAkB;EACvC,OAAOT,iCAAkB,CAACS,OAAO,CAAC,CAAC;AACrC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeCredentialsManager.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeCredentialsManager.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AA+ClD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,oBAAoB,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -16,4 +16,14 @@ export function signUpWithPassword({
|
|
|
16
16
|
export function signInWithSavedCredentials(requestJson) {
|
|
17
17
|
return CredentialsManager.signInWithSavedCredentials(requestJson);
|
|
18
18
|
}
|
|
19
|
+
export function signInWithGoogle(params) {
|
|
20
|
+
return CredentialsManager.signInWithGoogle({
|
|
21
|
+
...params,
|
|
22
|
+
nonce: params.nonce ?? '',
|
|
23
|
+
autoSelectEnabled: params.autoSelectEnabled ?? true
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function signOut() {
|
|
27
|
+
return CredentialsManager.signOut();
|
|
28
|
+
}
|
|
19
29
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CredentialsManager","signUpWithPasskeys","requestJson","preferImmediatelyAvailableCredentials","signUpWithPassword","username","password","signInWithSavedCredentials"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,kBAAkB,MAAM,+BAA4B;AAG3D,OAAO,SAASC,kBAAkBA,CAChCC,WAAmB,EACnBC,qCAA8C,GAAG,KAAK,EACrC;EACjB,OAAOH,kBAAkB,CAACC,kBAAkB,CAC1CC,WAAW,EACXC,qCACF,CAAC;AACH;AAEA,OAAO,SAASC,kBAAkBA,CAAC;EACjCC,QAAQ;EACRC;AAIF,CAAC,EAAE;EACDN,kBAAkB,CAACI,kBAAkB,CAAC;IAAEE,QAAQ;IAAED;EAAS,CAAC,CAAC;AAC/D;AAEA,OAAO,SAASE,0BAA0BA,CACxCL,WAAmB,EACE;EACrB,OAAOF,kBAAkB,CAACO,0BAA0B,CAACL,WAAW,CAAC;AACnE","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["CredentialsManager","signUpWithPasskeys","requestJson","preferImmediatelyAvailableCredentials","signUpWithPassword","username","password","signInWithSavedCredentials","signInWithGoogle","params","nonce","autoSelectEnabled","signOut"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,kBAAkB,MAAM,+BAA4B;AAG3D,OAAO,SAASC,kBAAkBA,CAChCC,WAAmB,EACnBC,qCAA8C,GAAG,KAAK,EACrC;EACjB,OAAOH,kBAAkB,CAACC,kBAAkB,CAC1CC,WAAW,EACXC,qCACF,CAAC;AACH;AAEA,OAAO,SAASC,kBAAkBA,CAAC;EACjCC,QAAQ;EACRC;AAIF,CAAC,EAAE;EACDN,kBAAkB,CAACI,kBAAkB,CAAC;IAAEE,QAAQ;IAAED;EAAS,CAAC,CAAC;AAC/D;AAEA,OAAO,SAASE,0BAA0BA,CACxCL,WAAmB,EACE;EACrB,OAAOF,kBAAkB,CAACO,0BAA0B,CAACL,WAAW,CAAC;AACnE;AAEA,OAAO,SAASM,gBAAgBA,CAACC,MAIhC,EAA6B;EAC5B,OAAOT,kBAAkB,CAACQ,gBAAgB,CAAC;IACzC,GAAGC,MAAM;IACTC,KAAK,EAAED,MAAM,CAACC,KAAK,IAAI,EAAE;IACzBC,iBAAiB,EAAEF,MAAM,CAACE,iBAAiB,IAAI;EACjD,CAAC,CAAC;AACJ;AAEA,OAAO,SAASC,OAAOA,CAAA,EAAkB;EACvC,OAAOZ,kBAAkB,CAACY,OAAO,CAAC,CAAC;AACrC","ignoreList":[]}
|
|
@@ -7,6 +7,16 @@ type PasskeyCredential = {
|
|
|
7
7
|
type: 'passkey';
|
|
8
8
|
authenticationResponseJson: string;
|
|
9
9
|
};
|
|
10
|
+
export type GoogleCredential = {
|
|
11
|
+
type: 'google-signin';
|
|
12
|
+
id: string;
|
|
13
|
+
idToken: string;
|
|
14
|
+
displayName?: string;
|
|
15
|
+
familyName?: string;
|
|
16
|
+
givenName?: string;
|
|
17
|
+
profilePicture?: string;
|
|
18
|
+
phoneNumber?: string;
|
|
19
|
+
};
|
|
10
20
|
type PasswordCredential = {
|
|
11
21
|
type: 'password';
|
|
12
22
|
username: string;
|
|
@@ -17,6 +27,12 @@ export interface Spec extends TurboModule {
|
|
|
17
27
|
signUpWithPasskeys(requestJson: Object, preferImmediatelyAvailableCredentials: boolean): Promise<Object>;
|
|
18
28
|
signUpWithPassword(credObject: CredObject): void;
|
|
19
29
|
signInWithSavedCredentials(requestJson: Object): Promise<Credential>;
|
|
30
|
+
signInWithGoogle(params: {
|
|
31
|
+
nonce: string;
|
|
32
|
+
serverClientId: string;
|
|
33
|
+
autoSelectEnabled: boolean;
|
|
34
|
+
}): Promise<GoogleCredential>;
|
|
35
|
+
signOut(): Promise<null>;
|
|
20
36
|
}
|
|
21
37
|
declare const _default: Spec;
|
|
22
38
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeCredentialsManager.d.ts","sourceRoot":"","sources":["../../../../src/NativeCredentialsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAEhE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,qCAAqC,EAAE,OAAO,GAC7C,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAEjD,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeCredentialsManager.d.ts","sourceRoot":"","sources":["../../../../src/NativeCredentialsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAEhE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,qCAAqC,EAAE,OAAO,GAC7C,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAEjD,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,gBAAgB,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,OAAO,CAAC;KAC5B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;;AAED,wBAA4E"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import type { Credential } from './NativeCredentialsManager';
|
|
1
|
+
import type { Credential, GoogleCredential } from './NativeCredentialsManager';
|
|
2
2
|
export declare function signUpWithPasskeys(requestJson: Object, preferImmediatelyAvailableCredentials?: boolean): Promise<Object>;
|
|
3
3
|
export declare function signUpWithPassword({ username, password, }: {
|
|
4
4
|
username: string;
|
|
5
5
|
password: string;
|
|
6
6
|
}): void;
|
|
7
7
|
export declare function signInWithSavedCredentials(requestJson: Object): Promise<Credential>;
|
|
8
|
+
export declare function signInWithGoogle(params: {
|
|
9
|
+
nonce?: string;
|
|
10
|
+
serverClientId: string;
|
|
11
|
+
autoSelectEnabled?: boolean;
|
|
12
|
+
}): Promise<GoogleCredential>;
|
|
13
|
+
export declare function signOut(): Promise<null>;
|
|
8
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE/E,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,qCAAqC,GAAE,OAAe,GACrD,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,QAEA;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAErB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAM5B;AAED,wBAAgB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvC"}
|
|
@@ -7,6 +7,16 @@ type PasskeyCredential = {
|
|
|
7
7
|
type: 'passkey';
|
|
8
8
|
authenticationResponseJson: string;
|
|
9
9
|
};
|
|
10
|
+
export type GoogleCredential = {
|
|
11
|
+
type: 'google-signin';
|
|
12
|
+
id: string;
|
|
13
|
+
idToken: string;
|
|
14
|
+
displayName?: string;
|
|
15
|
+
familyName?: string;
|
|
16
|
+
givenName?: string;
|
|
17
|
+
profilePicture?: string;
|
|
18
|
+
phoneNumber?: string;
|
|
19
|
+
};
|
|
10
20
|
type PasswordCredential = {
|
|
11
21
|
type: 'password';
|
|
12
22
|
username: string;
|
|
@@ -17,6 +27,12 @@ export interface Spec extends TurboModule {
|
|
|
17
27
|
signUpWithPasskeys(requestJson: Object, preferImmediatelyAvailableCredentials: boolean): Promise<Object>;
|
|
18
28
|
signUpWithPassword(credObject: CredObject): void;
|
|
19
29
|
signInWithSavedCredentials(requestJson: Object): Promise<Credential>;
|
|
30
|
+
signInWithGoogle(params: {
|
|
31
|
+
nonce: string;
|
|
32
|
+
serverClientId: string;
|
|
33
|
+
autoSelectEnabled: boolean;
|
|
34
|
+
}): Promise<GoogleCredential>;
|
|
35
|
+
signOut(): Promise<null>;
|
|
20
36
|
}
|
|
21
37
|
declare const _default: Spec;
|
|
22
38
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeCredentialsManager.d.ts","sourceRoot":"","sources":["../../../../src/NativeCredentialsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAEhE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,qCAAqC,EAAE,OAAO,GAC7C,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAEjD,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeCredentialsManager.d.ts","sourceRoot":"","sources":["../../../../src/NativeCredentialsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,0BAA0B,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAEhE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,qCAAqC,EAAE,OAAO,GAC7C,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAEjD,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,gBAAgB,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,OAAO,CAAC;KAC5B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;;AAED,wBAA4E"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import type { Credential } from './NativeCredentialsManager';
|
|
1
|
+
import type { Credential, GoogleCredential } from './NativeCredentialsManager';
|
|
2
2
|
export declare function signUpWithPasskeys(requestJson: Object, preferImmediatelyAvailableCredentials?: boolean): Promise<Object>;
|
|
3
3
|
export declare function signUpWithPassword({ username, password, }: {
|
|
4
4
|
username: string;
|
|
5
5
|
password: string;
|
|
6
6
|
}): void;
|
|
7
7
|
export declare function signInWithSavedCredentials(requestJson: Object): Promise<Credential>;
|
|
8
|
+
export declare function signInWithGoogle(params: {
|
|
9
|
+
nonce?: string;
|
|
10
|
+
serverClientId: string;
|
|
11
|
+
autoSelectEnabled?: boolean;
|
|
12
|
+
}): Promise<GoogleCredential>;
|
|
13
|
+
export declare function signOut(): Promise<null>;
|
|
8
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE/E,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,qCAAqC,GAAE,OAAe,GACrD,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,QAEA;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAErB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAM5B;AAED,wBAAgB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-credentials-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "A React Native library that implements the Credential Manager API for Android. This library allows you to manage passwords and passkeys in your React Native applications.",
|
|
5
5
|
"source": "./src/index.tsx",
|
|
6
6
|
"main": "./lib/commonjs/index.js",
|
|
@@ -48,7 +48,18 @@
|
|
|
48
48
|
"keywords": [
|
|
49
49
|
"react-native",
|
|
50
50
|
"ios",
|
|
51
|
-
"android"
|
|
51
|
+
"android",
|
|
52
|
+
"passkeys",
|
|
53
|
+
"webauthn",
|
|
54
|
+
"authentication",
|
|
55
|
+
"credential-manager",
|
|
56
|
+
"google-signin",
|
|
57
|
+
"passwordless",
|
|
58
|
+
"biometric",
|
|
59
|
+
"security",
|
|
60
|
+
"identity",
|
|
61
|
+
"fido2",
|
|
62
|
+
"signin"
|
|
52
63
|
],
|
|
53
64
|
"repository": {
|
|
54
65
|
"type": "git",
|
|
@@ -59,7 +70,7 @@
|
|
|
59
70
|
"bugs": {
|
|
60
71
|
"url": "https://github.com/benjamineruvieru/react-native-credentials-manager/issues"
|
|
61
72
|
},
|
|
62
|
-
"homepage": "https://
|
|
73
|
+
"homepage": "https://docs.benjamineruvieru.com/docs/react-native-credentials-manager/",
|
|
63
74
|
"publishConfig": {
|
|
64
75
|
"registry": "https://registry.npmjs.org/"
|
|
65
76
|
},
|
|
@@ -82,6 +93,7 @@
|
|
|
82
93
|
"react": "18.3.1",
|
|
83
94
|
"react-native": "0.77.0",
|
|
84
95
|
"react-native-builder-bob": "^0.36.0",
|
|
96
|
+
"react-native-dotenv": "^3.4.11",
|
|
85
97
|
"release-it": "^17.10.0",
|
|
86
98
|
"turbo": "^1.10.7",
|
|
87
99
|
"typescript": "^5.2.2"
|
|
@@ -11,6 +11,17 @@ type PasskeyCredential = {
|
|
|
11
11
|
authenticationResponseJson: string;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
+
export type GoogleCredential = {
|
|
15
|
+
type: 'google-signin';
|
|
16
|
+
id: string;
|
|
17
|
+
idToken: string;
|
|
18
|
+
displayName?: string;
|
|
19
|
+
familyName?: string;
|
|
20
|
+
givenName?: string;
|
|
21
|
+
profilePicture?: string;
|
|
22
|
+
phoneNumber?: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
14
25
|
type PasswordCredential = {
|
|
15
26
|
type: 'password';
|
|
16
27
|
username: string;
|
|
@@ -27,6 +38,12 @@ export interface Spec extends TurboModule {
|
|
|
27
38
|
signUpWithPassword(credObject: CredObject): void;
|
|
28
39
|
|
|
29
40
|
signInWithSavedCredentials(requestJson: Object): Promise<Credential>;
|
|
41
|
+
signInWithGoogle(params: {
|
|
42
|
+
nonce: string;
|
|
43
|
+
serverClientId: string;
|
|
44
|
+
autoSelectEnabled: boolean;
|
|
45
|
+
}): Promise<GoogleCredential>;
|
|
46
|
+
signOut(): Promise<null>;
|
|
30
47
|
}
|
|
31
48
|
|
|
32
49
|
export default TurboModuleRegistry.getEnforcing<Spec>('CredentialsManager');
|
package/src/index.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import CredentialsManager from './NativeCredentialsManager';
|
|
2
|
-
import type { Credential } from './NativeCredentialsManager';
|
|
2
|
+
import type { Credential, GoogleCredential } from './NativeCredentialsManager';
|
|
3
3
|
|
|
4
4
|
export function signUpWithPasskeys(
|
|
5
5
|
requestJson: Object,
|
|
@@ -26,3 +26,19 @@ export function signInWithSavedCredentials(
|
|
|
26
26
|
): Promise<Credential> {
|
|
27
27
|
return CredentialsManager.signInWithSavedCredentials(requestJson);
|
|
28
28
|
}
|
|
29
|
+
|
|
30
|
+
export function signInWithGoogle(params: {
|
|
31
|
+
nonce?: string;
|
|
32
|
+
serverClientId: string;
|
|
33
|
+
autoSelectEnabled?: boolean;
|
|
34
|
+
}): Promise<GoogleCredential> {
|
|
35
|
+
return CredentialsManager.signInWithGoogle({
|
|
36
|
+
...params,
|
|
37
|
+
nonce: params.nonce ?? '',
|
|
38
|
+
autoSelectEnabled: params.autoSelectEnabled ?? true,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function signOut(): Promise<null> {
|
|
43
|
+
return CredentialsManager.signOut();
|
|
44
|
+
}
|