20% 的 Facebook 凭据的 firebase 身份验证中缺少电子邮件

时间:2021-04-01 10:10:48

标签: firebase facebook firebase-authentication

我允许用户在我的应用上使用 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();
  });
}

1 个答案:

答案 0 :(得分:2)

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

如果我登录 Facebook,我总是选择不发送我的电子邮件 - 大多数情况下,第三方应用不需要它用于合法目的。

“我需要在我的应用中使用电子邮件地址” - 为什么?电子邮件营销?防止帐户重复?

如果您没有收到电子邮件,请假设用户已选择退出和/或没有与他们的帐户相关联的电子邮件。如果您需要,请让用户输入联系电子邮件地址并说明您使用它的目的。预计一些用户仍会选择退出并围绕它进行计划。

您可以随时将他们的用户名转换为不存在的电子邮件,例如 theirusername@noreply.users.yourapp.com,具体取决于您的用例。