将身份验证状态恢复为匿名

时间:2017-09-05 07:31:32

标签: firebase firebase-authentication angularfire2

我有一个网站,认证不是强制性的,无法使用该网站。

为了能够在未登录时保留用户数据,我在我的signInAnonymously()中使用AppComponent

当用户想要注册网站时,我按照以下步骤操作:

  • 要求oauth。
  • 检查此oauth是否已存在于我的数据库中。
    • 如果oauth不在数据库中,则恢复为上一个匿名状态。
    • 如果已经在数据库中,请获取用户数据。

但问题出在这里:一旦我拨打signInWithPopup(),最后一个身份验证状态丢失,因为它是匿名状态,我无法再次登录。

因为匿名状态包含我不希望用户放松的数据,所以如果注册过程失败,我必须能够恢复到最后的匿名状态。

1 个答案:

答案 0 :(得分:1)

我仍然不了解你的用例,但无论如何这里都有。 您在默认的App实例上匿名签名用户。

var app = firebase.initializeApp(config);
app.auth().signInAnonymously()....

然后使用相同的配置创建另一个Auth实例:

var appTemp = firebase.initializeApp(config, 'temp');
// Set persistence to none in case you forget to clear this.
appTemp.auth().setPersistence(firebase.auth.Auth.Persistence.NONE);
// Sign in the user with popup and save the credential.
var cred = null;
appTemp.auth().signInWithPopup(provider).then(function(result) {
  cred = result.credential;
  // Check the user email is registered in your DB.
  return isRegistered(result.user.email);
}).then(function(registered) {
  if (registered) {
    // User is registered. Delete and relink to original anonymous.
    return appTemp.auth().currentUser.delete().then(function() {
       return app.auth().currentUser.linkWithCredential(cred);
    });
  } else {
    // User not registered, just delete. The anonymous user remains.
    return appTemp.auth().currentUser.delete();
  }
})...

不确定这是否正是您想要的,但它会使用temp auth实例复制技术指向正确的方向。