20% 的 Facebook 凭据在 firebase 身份验证中丢失电子邮件

missing emails in firebase auth for 20% of facebook credentials

我允许用户在我的应用程序上使用 facebook 登录,由 firebase 身份验证支持。

在大约 20% 的 facebook 登录中,我没有收到用户的电子邮件。我需要我的应用程序中的电子邮件地址,但不知道为什么我没有收到它。

因为我在 80% 的时间里都得到了电子邮件地址,所以我假设我有正确的权限设置来检索它。

我还在 firebase-auth 中强制执行“每个电子邮件地址一个帐户”,因此这似乎与 Firebase Auth missing email address 中提出的问题不同。

我的代码的相关摘录:

export const FacebookSignUp: React.FC<SocialAuthProps & { title?: string }> = ({ onError, onSetWaiting, title }) => {
  async function onFacebookButtonPress() {
    onSetWaiting(true);
    const { email, first_name, accessToken } = await getFacebookUserData();
    const couldLogin = await tryLoginWithFacebook(email, accessToken);
    if (!couldLogin) {
      // Create a Firebase credential with the AccessToken
      const facebookCredential = FacebookAuthProvider.credential(accessToken);
      const userCredential = await firebaseAuth.signInWithCredential(facebookCredential);
      if (userCredential.user === null) {
        throw new Error("Null user");
      }
      const signupUser: SignupUserData = {
        userId: userCredential.user.uid,
        email,
        pseudo: first_name || undefined
      };
      await createSignupUser(signupUser).then(() => {
        onSetWaiting(false);
      });
    }
  }

  return (
    <SocialButton
      iconName="facebookIcon"
      title={title || "S'inscrire avec Facebook"}
      onPress={() =>
        onFacebookButtonPress().catch((err) => {
          onSetWaiting(false);
          if (err instanceof SocialAuthError) {
            onError(err);
          } else if (err instanceof Error) {
            const { message, name, stack } = err;
            serverError("Unexpected signup error", { message, name, stack });
          }
        })
      }
    />
  );
};

import { LoginManager, AccessToken, GraphRequest, GraphRequestManager } from "react-native-fbsdk";

export async function getFacebookUserData(): Promise<FacebookInfo> {
  LoginManager.logOut();
  const result = await LoginManager.logInWithPermissions(["public_profile", "email"]);

  if (result.isCancelled) {
    throw "User cancelled the login process";
  }

  // Once signed in, get the users AccesToken
  const { accessToken } = (await AccessToken.getCurrentAccessToken()) || {};
  if (!accessToken) {
    throw "Something went wrong obtaining access token";
  }

  return new Promise((resolve, reject) => {
    let req = new GraphRequest(
      "/me",
      {
        httpMethod: "GET",
        version: "v2.5",
        parameters: {
          fields: {
            string: "email,first_name"
          }
        }
      },
      (err, res) => {
        if (err || res === undefined) {
          reject(err);
        } else {
          const { first_name, email } = res as { first_name: string; email: string };
          resolve({ first_name, email, accessToken });
        }
      }
    );
    new GraphRequestManager().addRequest(req).start();
  });
}

Facebook 允许您选择不将您的电子邮件传递给第三方应用程序。你可以要求,但用户可以拒绝。

如果我 曾经 使用 Facebook 登录,我总是选择不传递我的电子邮件 - 大多数时候,第三方应用不需要它用于合法目的.

“我需要我的应用程序中的电子邮件地址”- 为什么?电子邮件营销?账户重复预防?

在您没有收到电子邮件的情况下,假设用户已选择退出 and/or 没有与他们的帐户绑定的电子邮件。如果您需要,请要求用户输入联系电子邮件地址并说明您使用它的目的。预计一些用户仍会选择退出并围绕它进行计划。

根据您的使用情况,您始终可以将他们的用户名转换为不存在的电子邮件,例如 theirusername@noreply.users.yourapp.com