如何在多个位置同步firebase用户? (分机+网站)

时间:2018-03-17 20:01:54

标签: firebase google-chrome-extension firebase-authentication firebaseui

我正在研究chrome扩展(提供主要功能)和补充网站(主要是个人资料和计费相关功能),两者都支持firebase后端。

我想知道是否可以实施以下方案:

  • 用户使用firebase身份验证(使用firebaseUI lib)登录扩展名
  • 我存储了一个可以用来重新验证该用户的令牌(是否有这样的令牌?)
  • 当用户打开网站时,我会使用令牌自动登录该用户。

虽然扩展程序和网站都有他们的登录/注册表单,但我想知道是否可以在扩展程序中登录用户并以某种方式自动登录网站上的同一用户,这样他们就不必输入他们的凭据两次?

到目前为止,我希望我可以使用下面的内容:

firebase.auth().currentUser.getIdToken(true).then(function(idToken) {
            console.log("idToken = ", idToken)
})

然后像这样使用idToken,因为如果我理解正确,那就是AWT:

firebase.auth().signInWithCustomToken(idToken).catch(function(error) {
    // Handle Errors here.
     var errorCode = error.code;
     var errorMessage = error.message;
     console.log("signInWithCustomToken: error = ", error)
 })

但它会出现以下错误:

code: "auth/invalid-custom-token"
message: "The custom token format is incorrect. Please check the documentation."

我可以解析显示所有用户信息的https://jwt.io/上的令牌,但最后会显示“无效签名”

所以我猜这个令牌只能用于检查身份验证(如admin.auth().verifyIdToken(idToken)),但不能用于登录用户。我是对的吗?

我知道我可以创建一个自定义令牌,但有没有任何简单的方法来解决这个问题并仅使用firebase功能从一个地方登录用户? (当然没有存储用户名/密码)

1 个答案:

答案 0 :(得分:2)

您无法使用Firebase ID令牌登录。你能做的是以下几点:

  1. 将用户会话保留在Chrome扩展程序中,并从那里运行所有经过身份验证的请求。在发送请求时,使用postMessage(带原始验证)与应用扩展程序进行通信。有了这个,您不必担心会话同步,也不会存储任何Firebase令牌或将其传递给可以访问扩展程序的Web应用程序或每个Web应用程序。

  2. 在验证请求的来源后,添加postMessage API以从扩展程序中获取ID令牌。然后,您可以使用ID令牌从Web应用程序发送请求。 (安全性低于1但更容易实现,会话存储在一个地方)。

  3. 创建一个带有ID令牌并返回自定义令牌的HTTP端点。这将verifyIdToken然后使用Admin SDK提供的createCustomToken为该用户创建相应的自定义令牌。然后,您postMessage在验证来源后从Chrome扩展程序到网页,并在该网络应用中使用该自定义令牌signInWithCustomToken。这是最不安全的,因为您提供端点以使用无限期会话交换短期ID令牌。您还将处理同步问题(用户从Chrome扩展程序注销,您必须从网站注销等)。