当我在 Android 中使用 Firebase 登录 Apple 时,为什么会收到空电子邮件?

问题描述 投票:0回答:1

每当我使用 Apple 登录时,我都会收到一封

null
电子邮件。请注意,显示名称不为空。另外,我已确保在尝试再次使用 Apple 登录之前撤销所有令牌,因为根据我的理解,Apple 在初次注册时仅提供一次电子邮件。这是我使用 Firebase 在 Android 中登录 Apple 的代码:

OAuth 提供商:

fun appleOAuthProvider(appLanguage: String): OAuthProvider {

    return OAuthProvider
        .newBuilder("apple.com")
        .setScopes(listOf("name", "email"))
        .addCustomParameter("locale", currentLanguageLocale(appLanguage))
        .build()

} //: FUN

登录:

private fun singInUser(
    auth: FirebaseAuth,
    context: Context,
    appLanguage: String,
    isSigningIn: MutableState<Boolean>,
    completion: (FirebaseUser?) -> Unit
) {

    auth
        .startActivityForSignInWithProvider(context.getActivity(), HelperFunctions.appleOAuthProvider(appLanguage))
        .addOnSuccessListener { authResult ->

            Log.d("SIGN IN WITH APPLE", "activitySignIn:onSuccess:${authResult.user}")
            completion(authResult.user)

        } //: ON SUCCESS

        .addOnFailureListener { e ->

            Log.w("SIGN IN WITH APPLE", "activitySignIn:onFailure", e)
            isSigningIn.value = false
            completion(null)

        } //: ON FAILURE

} //: FUN

登录后,我使用之前获得的

authResult.user
收集用户数据:

private fun collectDataFromApple(
    user: FirebaseUser?,
    completion: (SignInResult) -> Unit
) {

    val uid = user?.uid
    val email = user?.email
    var firstName = separatedFullName(user?.displayName)?.get(0)
    var lastName = separatedFullName(user?.displayName)?.get(1)

    if (firstName.isNullOrEmpty()) {
        firstName = lastName
    } else if (lastName.isNullOrEmpty()){
        lastName = firstName
    }

    completion(
        SignInResult(
            data =
            UserData(
                personalInformation = UserData.PersonalInformation(
                    userID = uid,
                    email = email,
                    firstName = firstName,
                    lastName = lastName,
                    imageBitmap = null,
                    isNewUser = true,
                    isEmailVerified = mutableStateOf(true),
                    firebaseHasData = false
                ),
                addressInformation = UserData.AddressInformation(),
                contributeStatistics = UserData.ContributeStatistics()
            ),
            errorMessage = null
        )
    )

} //: FUN

user?.email
由于未知原因返回 null。然而,
firstName
lastName
不为空。这是为什么?

android firebase kotlin firebase-authentication facebook-authentication
1个回答
1
投票

当您使用 Facebook 提供商对 Firebase 中的用户进行身份验证时,用户的电子邮件地址不会出现在 FirebaseUser 对象中。因此,要解决此问题,您必须读取提供程序列表并获取第二个提供程序,如以下代码行所示:

val auth = Firebase.auth
val email = auth.currentUser?.providerData?.get(1)?.email

你知道为什么我必须从列表中获取第二项而不是第一项吗?

FirebaseUser#getProviderData() 方法返回 UserInfo 类型的对象,其中:

表示用户的标准个人资料信息的集合。可用于公开身份提供商返回的个人资料信息,例如 Google 登录或 Facebook 登录。

通常,

providerData
列表中的第一个元素(索引 0)对应于用户的主要身份验证提供商,即 Google,第二个元素(索引 1)对应于辅助提供商,在本例中为 Apple ,在您的用例中。

如果您还希望电子邮件出现在 FirebaseUser 对象中,那么我建议您使用 FirebaseUser#updateEmail(email) 更新该对象。

© www.soinside.com 2019 - 2024. All rights reserved.