Open matthieuMay opened 3 months ago
@geroale do you have any ideas about this?
We have to update the README because the package is now simplified and doesn't have those methods/constants anymore. It has simpler methods that use the new api of the Google Credential Manager
@matthieuMay @marf You can check my implementation here: https://github.com/Spicy-Sparks/react-native-google-one-tap-signin/pull/18.
Optionally you can use this patch (that I'm currently using) - it's little bit different but works the same
diff --git a/node_modules/react-native-google-one-tap-signin/android/build.gradle b/node_modules/react-native-google-one-tap-signin/android/build.gradle
index 8242150..9a00144 100644
--- a/node_modules/react-native-google-one-tap-signin/android/build.gradle
+++ b/node_modules/react-native-google-one-tap-signin/android/build.gradle
@@ -51,5 +51,6 @@ dependencies {
implementation "androidx.appcompat:appcompat:1.1.0"
implementation("androidx.credentials:credentials:${safeExtGet('androidCredentialsVersion', '1.3.0-alpha01')}")
implementation("androidx.credentials:credentials-play-services-auth:${safeExtGet('androidCredentialsVersion', '1.3.0-alpha01')}")
+ implementation("com.google.android.libraries.identity.googleid:googleid:${safeExtGet('googleIdVersion', '1.1.1')}")
implementation "com.facebook.react:react-native:+"
}
diff --git a/node_modules/react-native-google-one-tap-signin/android/src/main/java/com/spicysparks/googleonetapsignin/RNGoogleOneTapSignInModule.java b/node_modules/react-native-google-one-tap-signin/android/src/main/java/com/spicysparks/googleonetapsignin/RNGoogleOneTapSignInModule.java
index d984aa8..10ff1b2 100644
--- a/node_modules/react-native-google-one-tap-signin/android/src/main/java/com/spicysparks/googleonetapsignin/RNGoogleOneTapSignInModule.java
+++ b/node_modules/react-native-google-one-tap-signin/android/src/main/java/com/spicysparks/googleonetapsignin/RNGoogleOneTapSignInModule.java
@@ -1,6 +1,7 @@
package com.spicysparks.googleonetapsignin;
import androidx.annotation.NonNull;
+
import androidx.credentials.ClearCredentialStateRequest;
import androidx.credentials.CreateCredentialResponse;
import androidx.credentials.CreatePasswordRequest;
@@ -11,11 +12,16 @@ import androidx.credentials.GetCredentialRequest;
import androidx.credentials.GetCredentialResponse;
import androidx.credentials.GetPasswordOption;
import androidx.credentials.PasswordCredential;
+import androidx.credentials.CustomCredential;
import androidx.credentials.exceptions.ClearCredentialException;
import androidx.credentials.exceptions.CreateCredentialException;
import androidx.credentials.exceptions.GetCredentialException;
+import com.google.android.libraries.identity.googleid.GetGoogleIdOption;
+import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential;
+
import com.facebook.react.bridge.Arguments;
+import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@@ -27,8 +33,12 @@ import java.util.concurrent.Executors;
public class RNGoogleOneTapSignInModule extends ReactContextBaseJavaModule {
+ private String webClientId;
+
CredentialManager credentialManager;
GetCredentialRequest getCredRequest;
+ GetGoogleIdOption googleIdOption;
+ GetPasswordOption getPasswordOption;
@Override
public String getName() {
@@ -37,11 +47,33 @@ public class RNGoogleOneTapSignInModule extends ReactContextBaseJavaModule {
public RNGoogleOneTapSignInModule(final ReactApplicationContext reactContext) {
super(reactContext);
+
credentialManager = CredentialManager.create(reactContext);
- GetPasswordOption getPasswordOption = new GetPasswordOption();
+ }
+
+
+ @ReactMethod
+ public void configure(
+ final ReadableMap config,
+ final Promise promise
+ ) {
+ this.webClientId = config.hasKey("webClientId") ? config.getString("webClientId") : null;
+
+ if (this.webClientId == null) {
+ promise.reject("ERROR", "webClientId is required");
+ return;
+ }
+
+ googleIdOption = new GetGoogleIdOption.Builder()
+ .setFilterByAuthorizedAccounts(true)
+ .setServerClientId(this.webClientId)
+ .build();
+
getCredRequest = new GetCredentialRequest.Builder()
- .addCredentialOption(getPasswordOption)
+ .addCredentialOption(googleIdOption)
.build();
+
+ promise.resolve(null);
}
@ReactMethod
@@ -61,15 +93,39 @@ public class RNGoogleOneTapSignInModule extends ReactContextBaseJavaModule {
@Override
public void onResult(GetCredentialResponse result) {
Credential credential = result.getCredential();
+
if (credential instanceof PasswordCredential) {
+ // This will be the case when the user has saved a password credential
+ // But we are not using it for now
String username = ((PasswordCredential) credential).getId();
String password = ((PasswordCredential) credential).getPassword();
WritableMap args = Arguments.createMap();
args.putString("id", username);
+ args.putString("type", "password");
args.putString("password", password);
promise.resolve(args);
+ } else if (credential instanceof CustomCredential) {
+
+ if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
+ GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(
+ (credential).getData());
+
+ String id = googleIdTokenCredential.getId();
+ String idToken = googleIdTokenCredential.getIdToken();
+ String givenName = googleIdTokenCredential.getGivenName();
+ String familyName = googleIdTokenCredential.getFamilyName();
+ WritableMap args = Arguments.createMap();
+ args.putString("id", id);
+ args.putString("idToken", idToken);
+ args.putString("givenName", givenName);
+ args.putString("familyName", familyName);
+ args.putString("type", "google");
+ promise.resolve(args);
+ } else {
+ promise.reject("ERROR", "Unexpected type of credential");
+ }
} else {
- promise.reject("ERROR", "Unexpected type of credential");
+ promise.reject("ERROR", "Unexpected type of credential - 2");
}
}
@Override
diff --git a/node_modules/react-native-google-one-tap-signin/src/GoogleOneTapSignIn.js b/node_modules/react-native-google-one-tap-signin/src/GoogleOneTapSignIn.js
index 3719590..a379d13 100644
--- a/node_modules/react-native-google-one-tap-signin/src/GoogleOneTapSignIn.js
+++ b/node_modules/react-native-google-one-tap-signin/src/GoogleOneTapSignIn.js
@@ -21,6 +21,18 @@ class GoogleOneTapSignIn {
return RNGoogleOneTapSignIn.signIn();
}
+ configure(options = {}) {
+ if (IS_IOS) {
+ return Promise.reject(new Error("Unsupported"));
+ }
+
+ if (!options.webClientId) {
+ throw new Error('RNGoogleOneTapSignIn: you need to pass web ClientID');
+ }
+
+ return RNGoogleOneTapSignIn.configure(options);
+ }
+
savePassword(userId, password) {
if (IS_IOS)
return Promise.reject(new Error("Unsupported"));
I did not have time to dig more but the package does not work as it used to :
If that is expected the README is not up to date