在不调用 Facebook API 的情况下将 Facebook 链接到 Firebase 匿名身份验证

Kyl*_*iss 5 javascript facebook-authentication firebase firebase-authentication

我在我的 Firebase 应用程序中创建匿名会话以在用户创建帐户之前保存用户数据。我看到 Firebase 允许将 Facebook 登录链接到一个匿名帐户,这听起来非常简洁,但这个过程的一个警告似乎是我必须自己获取 Facebook 令牌,在令人敬畏的 Firebase API 的温暖和舒适之外,这似乎奇怪的是,考虑到 Firebase 似乎代表应用程序执行的登录流程有多少,未开发。

有关如何从其帐户链接文档连接匿名帐户的代码示例:

var credential = firebase.auth.FacebookAuthProvider.credential(
    response.authResponse.accessToken);
Run Code Online (Sandbox Code Playgroud)

自然,我想使用 Firebase 获取令牌的方式

var provider = new firebase.auth.FacebookAuthProvider();

firebase.auth().signInWithPopup(provider).then(function(result) {
     // result.token or whatever would appear here
});
Run Code Online (Sandbox Code Playgroud)

但是如果我运行它,我将丢失我的匿名会话(以及我的匿名用户 ID,我们希望新的 Facebook 登录使用它)。

无论如何,是否可以从 Firebase 的身份验证机制中获取 Facebook 令牌,而无需登录用户并丢失我试图转换为可登录 Facebook 的帐户的匿名会话?(目标是不必自己调用 Facebook API,特别是因为我也会在这里添加 Google)

fny*_*fny 5

我认为您正在寻找#linkWithPopup#linkWithRedirect

var provider = new firebase.auth.FacebookAuthProvider();

user.linkWithPopup(provider).then(function(result) {
   console.log('Party ');
});
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因不能削减它,你总是可以选择自己做:

  • 匿名登录用户,并将用户存储在某处
  • 使用提供商登录用户并将令牌存储在某处
  • 删除提供者用户,然后将帐户与令牌关联

快速而肮脏的例子:

var googleToken;
var anonUser;

firebase.auth().signInAnonymously().then(function(user) {
  anonUser = user;
}).catch(function(error) {
  console.error("Anon sign in failed", error);
});

function signInWithGoogle() {
  var provider = new firebase.auth.GoogleAuthProvider();
  firebase.auth().signInWithPopup(provider).then(function(result) {
    googleToken = result.credential.idToken;
  }).catch(function(error) {
    console.error("Google sign in failed", error);
  })
}

function deleteAndLink() {
  firebase.auth().currentUser.delete().then(function() {
    var credential = 
      firebase.auth.GoogleAuthProvider.credential(googleToken);
    anonUser.link(googleCredential);
  }).then(function() {
    console.log("Link succeeded");
  }).catch(function(error) {
    console.error("Something went wrong", error);
  });
}
Run Code Online (Sandbox Code Playgroud)