1
votes

I have set up firebase authentication and am trying to send a welcome email

What I do not understand is why the authenticated user does not have an email field and only has this in the provider data. All the samples use something similar to:

exports.sendWelcomeEmail = functions.auth.user().onCreate(event => {
  const user = event.data; // The Firebase user.
  const email = user.email; // The email of the user.
  const displayName = user.displayName; // The display name of the user.
  console.log("New User created: " + JSON.stringify(user));
  console.log('email:', email);

However, my authenticated user does not seem to me to have an email My log shows

email: undefined
  • I am using google authentication from IOS with GIDSignInButton

My console log has the following

{
    "displayName": "Ryan H",
    "metadata": {
        "createdAt": "2017-06-19T10:06:21.000Z",
        "lastSignedInAt": "2017-06-19T10:06:21.000Z"
    },
    "photoURL": "https://lh6.googleusercontent.com/-MXne-lIR8e8/AAAAAAAAAAI/AAAAAAAAbeQ/Z1OvxasY/s96-c/photo.jpg",
    "providerData": [
        {
            "displayName": "Ryan H",
            "email": "[email protected]",
            "photoURL": "https://lh6.googleusercontent.com/-MXne-lIR8e8/AAAAAAAAAAI/AAAAAAAAbeQ/Z1asY/s96-c/photo.jpg",
            "providerId": "google.com",
            "uid": "1077081708"
        }
    ],
    "uid": "WjdlLc3QNvrmkj0yOuqo2"
}

As you can see there is no email except in the provider data.

Has there been a change in the model? Should I always try to get my email address from the provider data? Why are all the same code and examples I find using user.email ?

I currently have google and facebook enabled as "sign in methods".

Perhaps if I also enabled email/password I would have access.

I can confirm that in my IOS app the User after sign in does not have email either.

According to https://firebase.google.com/docs/auth/users

The first time a user signs up to your app, the user's profile data is populated using the available information: If the user signed up with an email address and password, only the primary email address property is populated

If the user signed up with a federated identity provider, such as Google or Facebook, the account information made available by the provider is used to populate the Firebase User's profile

1

1 Answers

1
votes

This is a workaround to my issue not really an answer:

I extract an email from the first provider I find, which in my case is always Google

exports.sendWelcomeEmail = functions.auth.user().onCreate(event => {
  const user = event.data; // The Firebase user.
  var email = user.email; // The email of the user.
  if (email == undefined) {
    for (var provider of user.providerData) {
      if (provider.email) {
        email = provider.email;
        break;
      }
    }
  }

  const displayName = user.displayName; // The display name of the user.
  // [END eventAttributes]
  console.log("New User created: " + JSON.stringify(user));
  console.log('email:', email);
  console.log('displayName:', displayName);
  sendWelcomeEmail(email,displayName)
  return;
});`