当前位置: 首页 > 知识库问答 >
问题:

检查Firebase Facebook用户是否存在,而无需从匿名用户开始创建用户

卫博雅
2023-03-14

在Firebase中,我需要在不创建用户的情况下检查Facebook用户是否存在。最初用户是匿名的,他们尝试使用Facebook登录。如果Facebook帐户尚未链接到我系统中的用户,我希望这失败。它不会链接到当前用户,因为他们是匿名的,

如果我使用Auth。SignandRetrieveDataWithCredential我预期会出现“auth/user not found”错误,但用户只是简单地创建的。这是一个bug还是预期?

let credential = firebase.auth.FacebookAuthProvider.credential(
        event.authResponse.accessToken)
    firebase.auth().signInAndRetrieveDataWithCredential(credential).then( (userCredential) => {
        let user = userCredential.user
        app.debug("DEBUG: Existing user signed in:"+user.uid)
        this.loginSuccess(user)
    }).catch( (err) => {
        app.error("ERROR re-signing in:"+err.code)
        $("#login_status_msg").text(err)
    })

如果我使用user . reauthenticateandretrievedatawithcredential,我会得到错误“auth/user-mismatch ”,这是有意义的,因为用户当前是匿名的。然而,我期望如果凭证不存在,可能会抛出“auth/user-not-found ”,但这并没有发生。

我没有看到一种方法可以让我的匿名用户,让他们使用Facebook登录,然后查看其他用户是否已经链接到该Facebook凭据,而无需创建用户(如果该用户不存在)。

如果你想知道为什么?我的设想是:系统允许匿名用户

  1. 用户登录,然后通过向 Facebook 注册转换为登录用户。
  2. 应用卸载
  3. 应用重新安装
  4. 用户启动应用,最初是匿名的。
  5. 他们尝试再次登录Facebook。在这一点上,我想阻止他们创建一个用户,如果他们还没有一个。如果他们已经有一个用户ID,代码可以正常工作,并将他们的匿名帐户ID更改为原始用户ID,这很好。

共有3个答案

商高谊
2023-03-14

您可以使用fetchSignInMethodsForEmail方法检查特定电子邮件是否已与特定提供商关联。这样,您将能够检查与您的用户关联的电子邮件的SighInMethods是否包含Facebook。com或不。

下面我给你看一个例子,关于我如何在我的应用程序中管理这种情况。我在我的代码中使用了RxJavaWrapper,但是您会明白如何管理它的要点:

 RxFirebaseAuth.fetchSignInMethodsForEmail(authInstance, email)
                .flatMap { providerResult ->
                    if (!providerResult.signInMethods!!.contains(credential.provider)) {
                        return@flatMap Maybe.error<AuthResult>(ProviderNotLinkedException(credential.provider))
                    } else {
                        return@flatMap RxFirebaseAuth.signInWithCredential(authInstance, credential)
                    }
                }
                .subscribe({ authResult ->
                  //Manage success
                }, { error ->
                  //Manage error
                })
    < li >首先,我检查与用户电子邮件关联的提供商(您可以从提供商处检索) < li >如果SignInMethods列表包含我的凭据提供程序,我将引发错误,否则,我将调用我的< code > signInWithCredential 方法来创建用户。 < li >继续您的工作流程。
欧阳何平
2023-03-14

您可以使用link AndRetrieveDataSusCredential

let credential = firebase.auth.FacebookAuthProvider.credential(
    event.authResponse.accessToken);
anonymousUser.linkAndRetrieveDataWithCredential(credential).then( (userCredential) => {
  // Firebase Auth only allows linking a credential if it is not
  // already linked to another account.
  // Now the anonymous account is upgraded to a permanent Facebook account.
}).catch( (err) => {
  // Check for code: auth/credential-already-in-use
  // When this error is returned, it means the credential is already
  // used by another account. 
})
呼延哲
2023-03-14

我找到了一个解决方案!实施起来并不难,但它看起来确实很粗糙。

因此,我们知道,当使用signInAndRetrieveDataWithCredential(cred)进行Facebook登录时,即使帐户尚不存在,也会创建该帐户。为了解决这个问题,我们需要确保处理以下三件事:

  1. 检测帐户是否为新帐户
  2. 删除Firebase创建的当前帐户
  3. 抛出一个错误以退出当前流并返回到您之前所在的位置。

我刚刚实施并测试了这个解决方案,它似乎工作得很好:

// ... do your stuff to do fb login, get credential, etc:
const userInfo = await firebase.auth().signInAndRetrieveDataWithCredential(credential)

// userInfo includes a property to check if the account is new:
const isNewUser = _.get(userInfo, 'additionalUserInfo.isNewUser', true)

// FIRST, delete the account we just made.
// SECOND, throw an error (or otherwise escape the current context.
if (isNewUser) {
  firebase.auth().currentUser.delete()
  throw new Error('Couldn\'t find an existing account.')
}

// If the user already exists, just handle normal login
return userInfo.user

我这样做的原因是为了确保用户必须通过我的应用程序中的“创建帐户流”。您的案例也很容易实现,如下所示:

let credential = firebase.auth.FacebookAuthProvider.credential(event.authResponse.accessToken)

firebase.auth().signInAndRetrieveDataWithCredential(credential)
  .then(userCredential => {
    const isNewUser = userCredential.additionalUserInfo.isNewUser
    if (isNewUser) {
      firebase.auth().currentUser.delete()
      // The following error will be handled in your catch statement
      throw new Error("Couldn't find an existing account.")
    }
    // Otherwise, handle login normally:
    const user = userCredential.user
    app.debug("DEBUG: Existing user signed in:"+user.uid)
    this.loginSuccess(user)
  }).catch( (err) => {
    app.error("ERROR re-signing in:"+err.code)
    $("#login_status_msg").text(err)
  })
 类似资料:
  • 我有麻烦让我的代码工作。当用户输入用户名时,它会检查数据库,看看它是否存在,以及它是否设置了

  • 问题内容: 我正在尝试允许用户通过搜索用户名来开始游戏并关注其他用户。我需要确保具有该用户名的用户存在。我正在使用以下代码,但是尽管调用了,但在应调用时却没有被调用。 JSON数据树 问题答案: 轻松解决: 不要使用.childAdded,因为当查询找不到任何内容时,该块将不会执行。 而是使用.Value并检查NSNull

  • 问题内容: 我正在尝试检查用户名是否存在。当我打电话时,快照值始终可用,但是它将打印我的整个数据库,而不仅仅是我请求的数据。当我打电话时,它总是返回null。我尝试了很多方法来解决。 这是我的代码: 这是我的json树: 这是安全规则: 问题答案: 修改 JSON 树以包含一个单独的节点,即在您创建新用户时添加每个用户的用户名,在用户修改其用户名时进行修改… 要检查您的用户名是否已经存在: 通过操

  • 我想检查一个用户名是否已经存在于我的数据库中。如果是的话,我想重定向回我的注册页面。我的代码可以添加用户名,但不检查用户名是否存在。请救命!!!这是register.php页面的代码。代码完全跳过对'username'的检查,并将其插入到数据库中(如果它存在或不存在)。

  • 问题内容: 因此,基本上,我想在注册表格中添加一个功能,该功能将检查数据库中是否已存在该用户名。 我对AJAX有几个问题- 1)我想创建一个AJAX请求on_change函数,所以像这样- 因此,据我所知,我必须在validation.php文件中包含所有在PHP中进行的验证,对吗?是否需要任何特殊的验证,或者只是使用sql语句进行的简单验证- 2)据我所知,我也必须通过$ .ajax传递POST

  • 我已经在谷歌上搜索了两个星期了,没有任何效果。我只想知道如何检查给定的用户名是否存在于我的MySQL数据库表中。表名为用户。但是它似乎绕过了我的if语句,直接添加用户名,导致我的表有相同用户名的重复。我试过很多代码,也试过很多方法。一直在使用MySQL,因为这是我们现在应该使用的。我可以给你我尝试过的任何方法,但这是我第100次尝试的最新方法。请注意,我知道这还没有完全准备好抵御SQL注射,我现在