auth0 / react-native-auth0

React Native toolkit for Auth0 API
https://auth0.com
MIT License
482 stars 207 forks source link

Getting "User cancelled auth" errors for first login sometimes (android only, landscape) #529

Closed gravitypersists closed 1 year ago

gravitypersists commented 1 year ago

edit: To anybody viewing this issue, the conversation is long, the quick answer is that this appears to be a configuration bug within the auth0 android package that this package relies on and can be fixed by incorporating this diff within node_modules/react-native-auth0/android/src/main/AndroidManifest.xml (use the patch-package tool for now if you need)

         <activity
             android:name="com.auth0.react.AuthenticationActivity"
+            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
             android:exported="false"
             android:launchMode="singleTask"
             android:theme="@android:style/Theme.Translucent.NoTitleBar" />

We've spent a rather long amount of time digging into this problem and here's the information we've collected.

Whenever I login correctly, I can see both a "Success Login" and "Success Exchange" within our auth0 logs, like so:

image

Whenever this issue occurs, I only see a "Success Login." Attempting to login again immediately after produces another "Success Login" but with a "Success Exchange" this time, meaning that we need to login twice in order to actually login.

The first attempt produces the fallthrough error "User cancelled auth"

Final regards: I suspect this might be some type of security measure in combination with android specific implementation in this library. I can provide more information if needed.

poovamraj commented 1 year ago

Hi @gravitypersists thanks for the detailed report. As you mentioned, I am not able to reproduce this on my end as well.

We had a similar error reported previously but couldn't continue much due to lack of information - https://github.com/auth0/react-native-auth0/issues/504

The only place for this to fallthrough is when this condition returns false.

Can you try to Log that particular place in the environment where the issue is happening to gather more information? You can fork the library and use that version or make the changes inside node_modules. The Log can be viewed using adb logcat command.

gravitypersists commented 1 year ago
10-13 17:27:57.490 17394 17394 D Result code: 0
10-13 17:27:57.490 17394 17394 D OK code: -1
10-13 17:27:57.491 17394 17394 D Request code: 1000
// at this point we also tried to log data.getData().toString() but that produced this error
//         Log.d("Data", data.getData().toString());
10-13 17:27:57.495 17394 17394 D AndroidRuntime: Shutting down VM
10-13 17:27:57.507 17394 17394 E AndroidRuntime: FATAL EXCEPTION: main
10-13 17:27:57.507 17394 17394 E AndroidRuntime: Process: com.opengov.cit.app.dev, PID: 17394
10-13 17:27:57.507 17394 17394 E AndroidRuntime: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1000, result=0, data=null} to activity {com.opengov.cit.app.dev/com.opengov.cit.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.ActivityThread.deliverResults(ActivityThread.java:5340)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.ActivityThread.handleSendResult(ActivityThread.java:5379)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:67)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:106)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.os.Looper.loopOnce(Looper.java:201)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:288)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:7842)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
10-13 17:27:57.507 17394 17394 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.auth0.react.A0Auth0Module.onActivityResult(A0Auth0Module.java:139)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.facebook.react.bridge.ReactContext.onActivityResult(ReactContext.java:328)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.facebook.react.ReactInstanceManager.onActivityResult(ReactInstanceManager.java:828)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.facebook.react.ReactDelegate.onActivityResult(ReactDelegate.java:90)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.facebook.react.ReactActivityDelegate.onActivityResult(ReactActivityDelegate.java:113)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at com.facebook.react.ReactActivity.onActivityResult(ReactActivity.java:70)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.Activity.dispatchActivityResult(Activity.java:8385)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    at android.app.ActivityThread.deliverResults(ActivityThread.java:5333)
10-13 17:27:57.507 17394 17394 E AndroidRuntime:    ... 13 more

the result code is 0 instead of -1. We can dig in more on this if you'd like, please let us know!

poovamraj commented 1 year ago

I assumed the issue would be with the data object received but it looks like it is null

  1. We can try to debug what happens when the browser opens and what URL is provided for redirection. This can be done by opening the Chrome browser and going to chrome://inspect/#devices. You can let me know what is the callback URL that is received.

  2. The redirection happens through RedirectActivity and AuthenticationActivity#onResume. Can we log in and see what the results we are getting are?

  3. We can try to run the Android SDK to see if a similar error happens in it as well or whether it happens only in React Native. We can easily test this. You can pull our Android repository and run the sample application which is already configured and ready to run. You can try Web Auth in it which should follow the same mechanism.

It would be interesting to know whether the issue occurs also for Android SDK in the same environment

Sorry that there are so many cases to check but since it is not reproducible here I wanted to cover all ground to see whats happening.

poovamraj commented 1 year ago

Also, can you verify whether AuthenticationActivity#onNewIntent is called? It is critical to set the information received from callback URL here

gravitypersists commented 1 year ago

Updates:

  1. Chrome devtools debugging:

  2. We have logged the following on a failed request (code edits provided for posterity):

    protected void onResume() {
        super.onResume();
        final Intent authenticationIntent = getIntent();
    
        if (!intentLaunched && authenticationIntent.getExtras() == null) {
            Log.d("XO-onResume", "Activity was launched in an unexpected way");
            finish(); // Activity was launched in an unexpected way
            return;
        } else if (!intentLaunched) {
            intentLaunched = true;
            Log.d("XO-onResume", "launchAuthenticationIntent called");
            launchAuthenticationIntent();
            return;
        }
    
        boolean resultMissing = authenticationIntent.getData() == null;
        if (resultMissing) {
            Log.d("XO-onResume resultMissing", "null");
            setResult(RESULT_CANCELED); 
        } else {
            Log.d("XO-onResume resultMissing", authenticationIntent.getData().toString());
            setResult(RESULT_OK, authenticationIntent);
        }
        finish();
    }
    
    protected void onNewIntent(@Nullable Intent intent) {
        super.onNewIntent(intent);
        Log.d("XO-onNewIntent", intent.getData().toString());
        setIntent(intent);
    }

also in RedirectActivity we log:

    public void onCreate(@Nullable Bundle savedInstanceBundle) {
        super.onCreate(savedInstanceBundle);
        Intent intent = new Intent(this, AuthenticationActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        if (getIntent() != null) Log.d("XO-onCreate intent", getIntent().getData().toString());
        if (getIntent() == null) Log.d("XO-onCreate intent", "null");
        if (getIntent() != null) intent.setData(getIntent().getData());
        startActivity(intent);
        finish();
    }

Unsuccessful logs:

// onResume called and it called launchAuthenticationIntent
10-14 18:02:07.693 21684 21684 D XO-onResume: launchAuthenticationIntent called
// onResume called 20 seconds later (presumably when we clicked login)
10-14 18:02:31.963 21684 21684 D XO-onResume resultMissing: null
10-14 18:02:39.693 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:03:10.234 21684 21684 D XO-onResume resultMissing: null
10-14 18:03:14.094 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:03:28.258 21684 21684 D XO-onResume resultMissing: null
10-14 18:04:01.620 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:04:22.793 21684 21684 D XO-onCreate intent: com.opengov.cit.app.dev://login.vpctest.com/android/com.opengov.cit.app.dev/callback?code=oKqPFeO855SqxasVyP8iehOJxzl9cJFgMuH0V1T6U7wHP&state=CWBqtKH-DO431uwfnXcEt1q-kCP3SSt_leqCeeNY8Qk
10-14 18:04:23.069 21684 21684 D XO-onResume resultMissing: null
10-14 18:04:23.114 21684 21684 D XO-onNewIntent: com.opengov.cit.app.dev://login.vpctest.com/android/com.opengov.cit.app.dev/callback?code=oKqPFeO855SqxasVyP8iehOJxzl9cJFgMuH0V1T6U7wHP&state=CWBqtKH-DO431uwfnXcEt1q-kCP3SSt_leqCeeNY8Qk

Successful login (note that this second attempt does not require credentials to be entered) directly after that unsuccessful attempt:

10-14 18:02:07.693 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:02:31.963 21684 21684 D XO-onResume resultMissing: null
10-14 18:02:39.693 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:03:10.234 21684 21684 D XO-onResume resultMissing: null
10-14 18:03:14.094 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:03:28.258 21684 21684 D XO-onResume resultMissing: null
10-14 18:04:01.620 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:04:22.793 21684 21684 D XO-onCreate intent: com.opengov.cit.app.dev://login.vpctest.com/android/com.opengov.cit.app.dev/callback?code=oKqPFeO855SqxasVyP8iehOJxzl9cJFgMuH0V1T6U7wHP&state=CWBqtKH-DO431uwfnXcEt1q-kCP3SSt_leqCeeNY8Qk
10-14 18:04:23.069 21684 21684 D XO-onResume resultMissing: null
10-14 18:04:23.114 21684 21684 D XO-onNewIntent: com.opengov.cit.app.dev://login.vpctest.com/android/com.opengov.cit.app.dev/callback?code=oKqPFeO855SqxasVyP8iehOJxzl9cJFgMuH0V1T6U7wHP&state=CWBqtKH-DO431uwfnXcEt1q-kCP3SSt_leqCeeNY8Qk
10-14 18:04:56.862 21684 21684 D XO-onResume: launchAuthenticationIntent called
10-14 18:05:03.111 21684 21684 D XO-onCreate intent: com.opengov.cit.app.dev://login.vpctest.com/android/com.opengov.cit.app.dev/callback?code=6pgBjRiZlip05EUXa3r1gAhJpF8ycSzAztICVVqW1dcnR&state=T8EOdF2PmdbacTgiBR8rkrezfsJEAaNSAKV3lp1t4dg
10-14 18:05:03.712 21684 21684 D XO-onNewIntent: com.opengov.cit.app.dev://login.vpctest.com/android/com.opengov.cit.app.dev/callback?code=6pgBjRiZlip05EUXa3r1gAhJpF8ycSzAztICVVqW1dcnR&state=T8EOdF2PmdbacTgiBR8rkrezfsJEAaNSAKV3lp1t4dg
// we did a poor job naming this one: Log.d("XO-onResume resultMissing", authenticationIntent.getData().toString());
10-14 18:05:03.713 21684 21684 D XO-onResume resultMissing: com.opengov.cit.app.dev://login.vpctest.com/android/com.opengov.cit.app.dev/callback?code=6pgBjRiZlip05EUXa3r1gAhJpF8ycSzAztICVVqW1dcnR&state=T8EOdF2PmdbacTgiBR8rkrezfsJEAaNSAKV3lp1t4dg
  1. We have tried to install the android app, and bear with us, because we aren't experienced with Java development, but I first tried running gradle wrapper in the sample directory and concluded that it needed the Auth0 package to be built, so then I tried running ./gradlew build --stacktrace in the root directory and produced this error:
    * Exception is:
    org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'com.auth0.gradle.oss-library.android', version: '0.17.0']
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.exceptionOccurred(DefaultPluginRequestApplicator.java:223)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:205)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyLegacyPlugin(DefaultPluginRequestApplicator.java:158)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.access$300(DefaultPluginRequestApplicator.java:61)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator$1$1.lambda$addLegacy$0(DefaultPluginRequestApplicator.java:114)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.lambda$applyPlugins$0(DefaultPluginRequestApplicator.java:143)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:143)
        at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:117)
        at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:65)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:62)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44)
        at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:62)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:351)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:369)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:350)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:42)
        at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
        at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:109)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:351)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$fromMutableState$1(DefaultProjectStateRegistry.java:374)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withReplacedLocks(DefaultWorkerLeaseService.java:345)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:374)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:350)
        at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:100)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:72)
        at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:761)
        at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:152)
        at org.gradle.api.internal.project.ProjectLifecycleController.lambda$ensureSelfConfigured$1(ProjectLifecycleController.java:63)
        at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
        at org.gradle.internal.model.StateTransitionController.lambda$maybeTransitionIfNotCurrentlyTransitioning$9(StateTransitionController.java:196)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
        at org.gradle.internal.model.StateTransitionController.maybeTransitionIfNotCurrentlyTransitioning(StateTransitionController.java:192)
        at org.gradle.api.internal.project.ProjectLifecycleController.ensureSelfConfigured(ProjectLifecycleController.java:63)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.ensureConfigured(DefaultProjectStateRegistry.java:325)
        at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:33)
        at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:49)
        at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:50)
        at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:64)
        at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
        at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$3(VintageBuildModelController.java:89)
        at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
        at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$10(StateTransitionController.java:210)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
        at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:206)
        at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:89)
        at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:71)
        at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$2(DefaultBuildLifecycleController.java:127)
        at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
        at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$8(StateTransitionController.java:187)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
        at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:183)
        at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:125)
        at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:33)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doScheduleAndRunTasks$2(DefaultBuildTreeLifecycleController.java:89)
        at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:101)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doScheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:88)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:106)
        at org.gradle.internal.model.StateTransitionController.lambda$transition$5(StateTransitionController.java:166)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
        at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
        at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:103)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:69)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
        at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:65)
        at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:136)
        at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
        at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:122)
        at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
        at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
        at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
        at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
        at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
        at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
        at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
        at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
        at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
        at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:52)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:40)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
        at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin class 'com.auth0.gradle.oss.RootProjectPlugin'.
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:173)
        at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:151)
        at org.gradle.api.plugins.PluginManager$apply.call(Unknown Source)
        at com.auth0.gradle.oss.AndroidLibraryPlugin.apply(AndroidLibraryPlugin.groovy:25)
        at com.auth0.gradle.oss.AndroidLibraryPlugin.apply(AndroidLibraryPlugin.groovy)
        at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:43)
        at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:51)
        at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:187)
        at org.gradle.api.internal.plugins.DefaultPluginManager.access$100(DefaultPluginManager.java:52)
        at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:282)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.plugins.DefaultPluginManager.lambda$doApply$0(DefaultPluginManager.java:167)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44)
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:166)
        at org.gradle.api.internal.plugins.DefaultPluginManager.apply(DefaultPluginManager.java:146)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.lambda$applyLegacyPlugin$2(DefaultPluginRequestApplicator.java:160)
        at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugin(DefaultPluginRequestApplicator.java:201)
        ... 162 more
    Caused by: org.gradle.api.InvalidUserCodeException: Cannot run Project.afterEvaluate(Closure) when the project is already evaluated.
        at org.gradle.api.internal.project.DefaultProject.failAfterProjectIsEvaluated(DefaultProject.java:1068)
        at org.gradle.api.internal.project.DefaultProject.afterEvaluate(DefaultProject.java:1062)
        at com.auth0.gradle.oss.RootProjectPlugin.apply(RootProjectPlugin.groovy:18)
        at com.auth0.gradle.oss.RootProjectPlugin.apply(RootProjectPlugin.groovy)
        at org.gradle.api.internal.plugins.ImperativeOnlyPluginTarget.applyImperative(ImperativeOnlyPluginTarget.java:43)
        at org.gradle.api.internal.plugins.RuleBasedPluginTarget.applyImperative(RuleBasedPluginTarget.java:51)
        at org.gradle.api.internal.plugins.DefaultPluginManager.addPlugin(DefaultPluginManager.java:187)
        at org.gradle.api.internal.plugins.DefaultPluginManager.access$100(DefaultPluginManager.java:52)
        at org.gradle.api.internal.plugins.DefaultPluginManager$AddPluginBuildOperation.run(DefaultPluginManager.java:282)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.plugins.DefaultPluginManager.lambda$doApply$0(DefaultPluginManager.java:167)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44)
        at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:166)
        ... 185 more

I see tests were run so the error I found was:

com.auth0.android.provider.CustomTabsControllerTest > shouldBindAndLaunchUriWithCustomization FAILED
    java.lang.AssertionError:
    Expected: is "com.auth0.browser"
         but: was null
        at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
        at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:6)
        at com.auth0.android.provider.CustomTabsControllerTest.shouldBindAndLaunchUriWithCustomization(CustomTabsControllerTest.java:158)

It appears like tests must pass before a local build can be created in order to run the sample project. Could you assist with that? Is there a way to build despite test failing, or does the test failing indicate an issue with our env?

poovamraj commented 1 year ago

I guess we figured the issue right there. It is one of the old suspects we faced in the Android app. Basically onResume is called before onNewIntent which is causing the flow to be disrupted.

In an application where the issue doesn't reproduce the logs will execute in this order

D/XO-onCreate intent: com.auth0samples://poovamraj.eu.auth0.com/android/com.auth0samples/callback?code=xxx
D/XO-onNewIntent: com.auth0samples://poovamraj.eu.auth0.com/android/com.auth0samples/callback?code=xxx
D/XO-onResume resultMissing: com.auth0samples://poovamraj.eu.auth0.com/android/com.auth0samples/callback?code=xxx
  1. Do you have the application in landscape mode?
  2. What is the target version of the Android app?
  3. Can you try adding this line of code under here and see if it fixes it?
gravitypersists commented 1 year ago
  1. Yes, we enforce landscape for now
  2. compileSdkVersion = 31, targetSdkVersion = 30
  3. Yes, this fix actually unstuck our engineer in Ukraine, but now in our automated QA test environment we are seeing this image (2)

(I need to check to see if that was happening before we ever experienced this error, but it looks like we've found a solution! Thank you so much Poovamraj! We'll use patch-package until the change is in npm.

poovamraj commented 1 year ago

@gravitypersists you can checkout this issue for more details on that - https://github.com/auth0/react-native-auth0/issues/531

poovamraj commented 1 year ago

Hi @gravitypersists, We have fixed this issue in this PR - https://github.com/auth0/react-native-auth0/pull/534

We will keep you informed once it is released. We will close this issue for now. Please feel free to reopen this issue if you have more doubts on this.

poovamraj commented 1 year ago

And the fix is available now - https://github.com/auth0/react-native-auth0/releases/tag/v2.14.1