【问题标题】:Revert auth state to last anonymous将身份验证状态恢复为上次匿名
【发布时间】:2017-09-05 07:31:32
【问题描述】:

我有一个网站,无需进行身份验证即可使用该网站。

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

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

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

但问题是:一旦我打电话给signInWithPopup(),最后一个身份验证状态就丢失了,因为它是一个匿名状态,我无法再次登录。

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

【问题讨论】:

  • 当您说“此 oauth 是否已在我的数据库中”时不清楚。您是否打算在某些条件下将匿名用户升级为 OAuth 用户,如果不满足条件,则坚持匿名用户?
  • 没错,当用户进入注册页面并注册时,我将他的电子邮件和其他数据添加到数据库中。登录过程的目标是检查数据库中是否存在电子邮件,如果存在则登录成功,否则登录失败并返回上一次匿名状态。

标签: firebase firebase-authentication angularfire2


【解决方案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();
  }
})...

不确定这是否正是您想要的,但它会使用临时身份验证实例复制技术为您指明正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2020-12-21
    • 2016-06-08
    • 2018-04-30
    相关资源
    最近更新 更多