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
。
我允许用户在我的应用程序上使用 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
。