Skip to content

[firebase_auth] Fix NoSuchMethodError exception in reauthenticateWithCredential #237

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Nov 18, 2019
Merged

Conversation

fabriziocacicia
Copy link

@fabriziocacicia fabriziocacicia commented Sep 29, 2019

Fix NoSuchMethodError exception when calling FirebaseUser.reauthenticateWithCredential

Description

The stacktrace of the issue was this:

#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      new AuthResult._ (package:firebase_auth/src/auth_result.dart:12:36)
#2      FirebaseUser.reauthenticateWithCredential (package:firebase_auth/src/firebase_user.dart:213:23)
<asynchronous suspension>
#3      ...............

This is the relevant part in auth_result.dart:

class AuthResult {
  AuthResult._(this._data, FirebaseApp app)
      : user = FirebaseUser._(_data['user'].cast<String, dynamic>(), app);

  final Map<String, dynamic> _data;

So, the data parameter passed to the FirebaseUser constructor was null.

From the reauthenticateWithCredential method:

Future<AuthResult> reauthenticateWithCredential(
      AuthCredential credential) async {
    assert(credential != null);
    final Map<String, dynamic> data =
        await FirebaseAuth.channel.invokeMapMethod<String, dynamic>(
      'reauthenticateWithCredential',
      <String, dynamic>{
        'app': _app.name,
        'provider': credential._provider,
        'data': credential._data,
      },
    );
    return AuthResult._(data, _app);
  }

the data parameter passed to AuhtResult came from the reauthenticateWithCredential invoked channel method.

By looking inside the handleReauthenticateWithCredential method in the FirebaseAuthPlugin.java I notice the line:

currentUser
        .reauthenticate(credential)
        .addOnCompleteListener(new TaskVoidCompleteListener(result));

The reauthenticate has a return type of Task<void>, for this reason, the data in the reauthenticateWithCredential was filled with null.
The FirebaseUser's reauthenticateAndRetrieveData method has Task<AuthResult> as return type. Also the SignInCompleteListener returns a map containing the Firebase user data inside the "user" key (exactly what the AuthResult needs in its constructor).
By applying these two modifications the code works properly.

Related Issues

Fixes #76
Fixes #1085

Checklist

Before you create this PR confirm that it meets all requirements listed below by checking the relevant checkboxes ([x]). This will ensure a smooth and quick review process.

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • If the pull request affects only one plugin, the PR title starts with the name of the plugin in brackets (e.g. [cloud_firestore])
  • My PR includes unit or integration tests for all changed/updated/fixed behaviors (See Contributor Guide).
  • All existing and new tests are passing.
  • I updated/added relevant documentation (doc comments with ///).
  • The analyzer (flutter analyze) does not report any problems on my PR.
  • I read and followed the Flutter Style Guide.
  • The title of the PR starts with the name of the plugin surrounded by square brackets, e.g. [shared_preferences]
  • I updated pubspec.yaml with an appropriate new version according to the pub versioning philosophy.
  • I updated CHANGELOG.md to add a description of the change.
  • I signed the CLA.
  • I am willing to follow-up on review comments in a timely manner.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate a breaking change in CHANGELOG.md and increment major revision).
  • No, this is not a breaking change.

Fix NoSuchMethodError exception when calling FirebaseUser.reauthenticateWithCredential
@fabriziocacicia
Copy link
Author

I can't figure out why the build fails

@hungnt-kayac
Copy link

hungnt-kayac commented Oct 2, 2019

@fabryx92 i think you also have to fix ios plugin.
in that case, i've took a look at
https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m#L238-L244
and found that it didn't set return object.
in my opinion, i think it should be

else if ([@"reauthenticateWithCredential" isEqualToString:call.method]) {
    [[self getAuth:call.arguments].currentUser
        reauthenticateAndRetrieveDataWithCredential:[self getCredential:call.arguments]
                                         completion:^(FIRAuthDataResult *r, NSError *error) {
                                           [self sendResult:result forAuthDataResult:r error:error];
                                         }];
  }

@fabriziocacicia
Copy link
Author

@hungnt-kayac thank you! You are right, I focused only on the Android part. I'm not very familiar with ios development, maybe because of this, I forgot it. Your reply was really helpful!

@fabriziocacicia fabriziocacicia changed the title [firebase_auth] Fix NoSuchMethodError exception [firebase_auth] Fix NoSuchMethodError exception in reauthenticateWithCredential Oct 9, 2019
@fabriziocacicia
Copy link
Author

Why now the build fails? Editing the changelog only? I did again all the steps written in the Contribution guide to be sure that all is fine, and it is.

@collinjackson collinjackson merged commit 530a43a into firebase:master Nov 18, 2019
thatfiredev pushed a commit to thatfiredev/flutterfire that referenced this pull request Nov 26, 2019
* bump core version to 0.4.1+4 (firebase#1395)

* Remove deprecated firebase-core dependency (firebase#1417)

* Remove deprecated firebase-core dependency

* [firebase_auth] getIdToken use actual refresh value instead of checking if object exists (firebase#1334)

* getIdToken use actual refresh value instead of checking if object exists

* getIdToken refresh integration test

* update xcode to v11 (firebase#1420)

* Update FirebaseApp creation in tests (firebase#1406)

* [firebase_database] Support v2 android embedder. (firebase#287)

* [firebase_remote_config] Support v2 android embedder. (firebase#282)

* [CI] Add version to example apps (firebase#1426)

* Add hardcode version to example apps

* [firebase_core] Add platform interface (firebase#1324)

* Move firebase_core to firebase_core/firebase_core
* Add firebase_core_platform_interface package
* Update cirrus scripts and documentation

* [firebase_dynamic_links] Add support of expanding from short links (firebase#1381)

* Fixes strict compilation errors. (firebase#1331)

* Upgrade crashlytics to v2 plugin API (firebase#1370)

* Upgraded Crashlytics to v2 of Flutter Plugins.

* Format documentation lists (See also & Errors) correctly (firebase#298)

Fix documentation list format.

* [firebase_auth] Fix NoSuchMethodError exception in `reauthenticateWithCredential` (firebase#237)

* [firebase_auth] Fix NoSuchMethodError exception

Fix NoSuchMethodError exception when calling FirebaseUser.reauthenticateWithCredential

* add integration test

* Fix analyzer warnings

Co-Authored-By: Collin Jackson <[email protected]>

* [cloud_firestore] [firebase_performance] fix analyzer warnings (firebase#1453)

* fix analyzer warnings

* [CI] Skip flaky firebase_performance driver tests (firebase#1452)

* Skip flaky firebase_performance driver tests

* [firebase_auth] Added missing Exception to the reauthenticateWithCredential docs (firebase#1448) (firebase#1449)

* Added missing Exception to the reauthenticateWithCredential docs (firebase#1448)

* [firebase_remote_config] Bumps Android Firebase dependency to 19.0.3 (firebase#1443)

* Bump AGP, Gradle & Google Services Plugin

* Bumps dependency to Firebase Config 19.0.3

* Replaces a deprecated method usage with the updated version

* [firebase_messaging] Use UNUserNotificationCenter for ios 10+ (firebase#121)

* Use UNUserNotificationCenter for ios 10+

* Add swift documentation

* Move http test to README

* Update CONTRIBUTING.md (firebase#1473)

Removes obsolete recommendations about removing mockito (which is now used in testing federated plugins).

* [firebase_core] Migrate to platform_interface (firebase#1472)

* [firebase_messaging] Add an ArgumentError when passing invalid background message (firebase#252)

* [firebase_dynamic_links] support v2 embedding (firebase#1372)

* [cloud_firestore] Fix test that used FirebaseApp.channel (firebase#1476)

* [cloud_firestore] Fix test that used FirebaseApp.channel

* dartfmt

* bump version

* Fixed dynamic issue

* Fixed dynamic issue

* FIxed Object to list of object mapping

* Fixed text result expectation

* Reverted some changes

* Satisfying formatter

* Added android x to pass the test

* Fixed changed log auto formatting
@firebase firebase locked and limited conversation to collaborators Aug 18, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
7 participants