Spicy-Sparks / react-native-google-one-tap-signin

MIT License
12 stars 7 forks source link

v1.0.7 breaks this package #17

Open matthieuMay opened 3 months ago

matthieuMay commented 3 months ago

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

marf commented 3 months ago

@geroale do you have any ideas about this?

geroale commented 3 months ago

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

MateuszRostkowski commented 2 months ago

@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"));