dart_firebase_admin icon indicating copy to clipboard operation
dart_firebase_admin copied to clipboard

Creating User fails

Open niklasbartsch opened this issue 2 years ago • 24 comments

Has anyone already used the createUser function?

I always get a FirebaseAuthAdminException with the code auth/internalerror and the message An internal error has occurred.

final createRequest = CreateRequest(
      email: email,
      displayName: '$firstName $lastName',
      password: randomPassword,
    );

try {
      user = await auth.createUser(createRequest);
 } on FirebaseAuthAdminException catch (e) {
      print('');
      print('FirebaseAuthAdminException');
      print('code: ${e.code}');
      print('message: ${e.message}');
 } catch (e) {
      print('catched: $e);
 }

niklasbartsch avatar Nov 29 '23 15:11 niklasbartsch

Pretty sure it worked before. Let me check

rrousselGit avatar Nov 29 '23 15:11 rrousselGit

This works just fine for me. Do you maybe have a more specific example? Maybe it's a specific email/password combination that's the issue?

rrousselGit avatar Nov 30 '23 14:11 rrousselGit

Has anyone already used the createUser function?

I always get a FirebaseAuthAdminException with the code auth/internalerror and the message An internal error has occurred.

final createRequest = CreateRequest(
      email: email,
      displayName: '$firstName $lastName',
      password: randomPassword,
    );

try {
      user = await auth.createUser(createRequest);
 } on FirebaseAuthAdminException catch (e) {
      print('');
      print('FirebaseAuthAdminException');
      print('code: ${e.code}');
      print('message: ${e.message}');
 } catch (e) {
      print('catched: $e);
 }

This works fine for me tho, print the email/password combination and make sure it exists

samtuga1 avatar Nov 30 '23 16:11 samtuga1

I have still the same issue. The email and password is correct. I printed the error code and its AuthClientErrorCode.internalError What am I missing?

Future<UserRecord> createUser(CreateRequest properties) async {
    return _authRequestHandler
        .createNewAccount(properties)
        // Return the corresponding user record.
        .then(getUser)
        .onError<FirebaseAuthAdminException>((error, _) {
      if (error.errorCode == AuthClientErrorCode.userNotFound) {
        // Something must have happened after creating the user and then retrieving it.
        throw FirebaseAuthAdminException(
          AuthClientErrorCode.internalError,
          'Unable to create the user record provided.',
        );
      }
      throw error;
    });
  }

It seems like the user is not created fast enough 🤷‍♂️

niklasbartsch avatar Dec 07 '23 09:12 niklasbartsch

print the stacktrace and see where it leads to

samtuga1 avatar Dec 07 '23 09:12 samtuga1

@niklasbartsch Give us more than this. Like the mail or password, or a git repository to reproduce the issue.

rrousselGit avatar Dec 07 '23 10:12 rrousselGit

Maybe this smaler example helps:


import 'package:api/helpers/extensions.dart';
import 'package:dart_firebase_admin/auth.dart';
import 'package:dart_frog/dart_frog.dart';

Future<Response> onRequest(RequestContext context) async {
  final auth = context.firebaseAuth;

  try {
    await auth.createUser(
      CreateRequest(
        email: '[email protected]',
        password: 'Hello1234',
      ),
    );
  } catch (e) {
    print('create user failed: $e');
  }

  return Response(body: 'Welcome to Dart Frog!');
}

create user failed: FirebaseAuthAdminException: auth/internalerror: An internal error has occurred.

The function is failing, but the user gets created.

niklasbartsch avatar Dec 07 '23 10:12 niklasbartsch

This too works fine for me. It'd help if you could create a git repository at this point.

rrousselGit avatar Dec 07 '23 12:12 rrousselGit

I created this sample dart_frog server.

[PROJECT_ID] and [username] has to be set manually user_api

niklasbartsch avatar Dec 07 '23 15:12 niklasbartsch

Could you make an example without dart_frog? I don't use that package and am not familiar with it.

rrousselGit avatar Dec 07 '23 15:12 rrousselGit

Could you make an example without dart_frog? I don't use that package and am not familiar with it.

@niklasbartsch Check out Pharaoh It is a backend framework that is highly inspired by ExpressJS. it is very easy to use when coming from Express. you can try building your example with it

samtuga1 avatar Dec 07 '23 16:12 samtuga1

You shouldn't need any special backend for the example.

A simple main directly executing createUser should do.

rrousselGit avatar Dec 07 '23 17:12 rrousselGit

You can find my simplified code in the local_main.dart file.

The user gets created but the functions throws the same error.

As I mentioned it is looking too early for the not yet created user.

FirebaseAuthAdminException: auth/internalerror: An internal error has occurred.

Your code in the dart_firebase_admin package:


  /// Creates a new user.
  ///
  /// See https://firebase.google.com/docs/auth/admin/manage-users#create_a_user
  /// for code samples and detailed documentation.
  ///
  /// Returns A Future fulfilled with the user
  /// data corresponding to the newly created user.
  Future<UserRecord> createUser(CreateRequest properties) async {
    return _authRequestHandler
        .createNewAccount(properties)
        // Return the corresponding user record.
        .then(getUser)
        .onError<FirebaseAuthAdminException>((error, _) {
      if (error.errorCode == AuthClientErrorCode.userNotFound) {
        // Something must have happened after creating the user and then retrieving it.
        throw FirebaseAuthAdminException(
          AuthClientErrorCode.internalError,
          'Unable to create the user record provided.',
        );
      }
      throw error;
    });
  }

niklasbartsch avatar Dec 10 '23 14:12 niklasbartsch

As I mentioned it is looking too early for the not yet created user.

Where?
The getUser invocation is correct. That's exactly how the JS SDK does it too.

So far, there are no indications that your "internalError" is pointing to the "Unable to create the user record". You haven't shared the message nor the stacktrace after-all.

You can find my simplified code in the local_main.dart file.

I hate to say it, but your code works for me.

rrousselGit avatar Dec 10 '23 15:12 rrousselGit

That is not the answer I was hoping for 😅

dart local_main.dart
error Code: AuthClientErrorCode.userNotFound
Stacktrace: #0      main (file:///Users/niklasbartsch/dev/user_api/local_main.dart:52:37)
<asynchronous suspension>

FirebaseAuthAdminException: auth/internalerror: An internal error has occurred.

"error Code:" is from the onError Function

niklasbartsch avatar Dec 10 '23 16:12 niklasbartsch

@niklasbartsch just confirming you have email authentication enabled on your project?

Ehesp avatar Dec 10 '23 16:12 Ehesp

Could you make an example without dart_frog? I don't use that package and am not familiar with it.

@niklasbartsch Check out Pharaoh It is a backend framework that is highly inspired by ExpressJS. it is very easy to use when coming from Express. you can try building your example with it

I'm currently too happy with dart_frog. I've been using it with Globe.dev since august and its working like a charm.

niklasbartsch avatar Dec 10 '23 16:12 niklasbartsch

@niklasbartsch just confirming you have email authentication enabled on your project?

Yes. 👍

niklasbartsch avatar Dec 10 '23 16:12 niklasbartsch

Another quick check would be 'npm i firebase-tools', use the same service account and see if it works. If it does, then we suspect it's to do with how the request is authenticated?

Ehesp avatar Dec 10 '23 16:12 Ehesp

I only use Platform.environment for the server. I already use the firebase-tools on my local machine...

niklasbartsch avatar Dec 10 '23 16:12 niklasbartsch

I printed the user id from the createNewAccount function and its the same one that gets created.

I tried to get the user with the id in a separate function and that failed too. I also tried other ids of users that I already use in the frontend, didn't work either.

FirebaseAuthAdminException: auth/usernotfound: There is no user record corresponding to the provided identifier.

There is only one created account that i can find with the getUserByEmail and the uid of this user is not the one that I can find in the console.

To validate that I am in the correct project I printed the firebaseAuth.app.projectId and its correct

niklasbartsch avatar Dec 10 '23 17:12 niklasbartsch

From your description, users are correctly created.
Sounds like what you're saying is that getUser does not work on your side.

Maybe try and make make new steps to reproduce the issue that do not rely on createNewAccount?

Such as maybe:

  • Manually create a new user in the Firebase console
  • call getUser on that newly created user

It sounds like this fails for you. So it'd be valuable to see how exactly you did this specifically

rrousselGit avatar Dec 10 '23 17:12 rrousselGit

I tried to create a user in the firebase console and through the app. I am not able to get both accounts with getUserByEmail or getUser. Also not after signing in with them.

Any ideas why I get a wrong uid from the one user I can fetch?

niklasbartsch avatar Dec 10 '23 17:12 niklasbartsch

Nope, no idea. I have yet to see a case where it doesn't work for me.

rrousselGit avatar Dec 10 '23 17:12 rrousselGit

In the lack of a way to reproduce the issue, I'll have to close this.

If you have any means of reproducing this reliably, please share :)

rrousselGit avatar Jul 15 '24 15:07 rrousselGit