如何跨多个位置同步 firebase 用户? (扩展名+网站)
How to sync firebase users across several locations? (extension + website)
我正在开发 chrome 扩展(提供主要功能)和补充网站(主要是配置文件和计费相关功能),两者均由 firebase 后端支持。
我想知道是否可以实现以下场景:
- 用户使用 firebase 身份验证(使用 firebaseUI lib)使用扩展程序登录
- 我存储了一个令牌,我可以用它来重新验证该用户(有这样的令牌吗?)
- 当用户打开网站时,我使用令牌自动登录该用户。
虽然扩展程序和网站都有它们的 login/signup 表单,但我想知道是否可以在扩展程序中登录用户并以某种方式自动在网站上登录同一用户,这样他们就没有输入他们的凭据两次?
到目前为止,我希望我可以使用如下所示的东西:
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/
上的令牌,它显示了所有用户信息,但最后它显示 "invalid signature"
所以我猜这个令牌只能用于检查身份验证(如 admin.auth().verifyIdToken(idToken)
)但不能用于登录用户。我说的对吗?
我知道我可以创建一个自定义令牌,但是有什么简单的方法可以解决这个问题并仅使用 firebase 功能从一个地方登录用户吗? (当然不存储username/password)
您无法使用 Firebase ID 令牌登录。您可以执行以下操作:
将用户会话保留在 chrome 扩展中,并 运行 来自那里的所有经过身份验证的请求。使用 postMessage
(带有来源验证)在任何时候发送请求时与来自应用程序的扩展进行对话。有了这个,您不必担心会话同步,并且不会将 Firebase 令牌存储或传递给 Web 应用程序或可以访问该扩展程序的每个 Web 应用程序。
添加 postMessage
API 以在验证请求来源后从扩展中获取 ID 令牌。然后,您可以使用 ID 令牌从 Web 应用程序发送请求。 (不如 1 安全,但更容易实现,会话存储在一个地方)。
创建一个采用 ID 令牌和 returns 自定义令牌的 HTTP 端点。这将 verifyIdToken
and then create a corresponding custom token for that user using createCustomToken
provided by Admin SDK. You then postMessage
that from chrome extension to the web page after verifying origin and signInWithCustomToken
与该网络应用程序中的自定义令牌。这是最不安全的,因为您提供了一个端点来与无限期会话交换短期 ID 令牌。您还将处理同步问题(用户从 chrome 扩展程序注销,您必须从网站注销等)。
我正在开发 chrome 扩展(提供主要功能)和补充网站(主要是配置文件和计费相关功能),两者均由 firebase 后端支持。
我想知道是否可以实现以下场景:
- 用户使用 firebase 身份验证(使用 firebaseUI lib)使用扩展程序登录
- 我存储了一个令牌,我可以用它来重新验证该用户(有这样的令牌吗?)
- 当用户打开网站时,我使用令牌自动登录该用户。
虽然扩展程序和网站都有它们的 login/signup 表单,但我想知道是否可以在扩展程序中登录用户并以某种方式自动在网站上登录同一用户,这样他们就没有输入他们的凭据两次?
到目前为止,我希望我可以使用如下所示的东西:
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/
上的令牌,它显示了所有用户信息,但最后它显示 "invalid signature"
所以我猜这个令牌只能用于检查身份验证(如 admin.auth().verifyIdToken(idToken)
)但不能用于登录用户。我说的对吗?
我知道我可以创建一个自定义令牌,但是有什么简单的方法可以解决这个问题并仅使用 firebase 功能从一个地方登录用户吗? (当然不存储username/password)
您无法使用 Firebase ID 令牌登录。您可以执行以下操作:
将用户会话保留在 chrome 扩展中,并 运行 来自那里的所有经过身份验证的请求。使用
postMessage
(带有来源验证)在任何时候发送请求时与来自应用程序的扩展进行对话。有了这个,您不必担心会话同步,并且不会将 Firebase 令牌存储或传递给 Web 应用程序或可以访问该扩展程序的每个 Web 应用程序。添加
postMessage
API 以在验证请求来源后从扩展中获取 ID 令牌。然后,您可以使用 ID 令牌从 Web 应用程序发送请求。 (不如 1 安全,但更容易实现,会话存储在一个地方)。创建一个采用 ID 令牌和 returns 自定义令牌的 HTTP 端点。这将
verifyIdToken
and then create a corresponding custom token for that user usingcreateCustomToken
provided by Admin SDK. You thenpostMessage
that from chrome extension to the web page after verifying origin andsignInWithCustomToken
与该网络应用程序中的自定义令牌。这是最不安全的,因为您提供了一个端点来与无限期会话交换短期 ID 令牌。您还将处理同步问题(用户从 chrome 扩展程序注销,您必须从网站注销等)。