我允许用户在我的应用上使用 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();
});
}
答案 0 :(得分:2)
Facebook 允许您选择不将电子邮件传递给第三方应用。您可以请求它,但用户可以拒绝它。
如果我登录 Facebook,我总是选择不发送我的电子邮件 - 大多数情况下,第三方应用不需要它用于合法目的。
“我需要在我的应用中使用电子邮件地址” - 为什么?电子邮件营销?防止帐户重复?
如果您没有收到电子邮件,请假设用户已选择退出和/或没有与他们的帐户相关联的电子邮件。如果您需要,请让用户输入联系电子邮件地址并说明您使用它的目的。预计一些用户仍会选择退出并围绕它进行计划。
您可以随时将他们的用户名转换为不存在的电子邮件,例如 theirusername@noreply.users.yourapp.com
,具体取决于您的用例。