我正在开发chrome扩展程序(提供主要功能)和补充网站(主要是个人资料和计费相关功能),两者都由Firebase后端提供支持。
我想知道是否可以实现以下方案:
- 用户使用 Firebase 身份验证(使用 FirebaseUI 库)使用扩展程序登录
- 我存储了一个令牌,可用于重新验证该用户(有这样的令牌吗?
- 当用户打开网站时,我使用令牌自动登录该用户。
虽然扩展程序和网站都有其登录/注册表单,但我想知道是否可以在扩展程序中登录用户并以某种方式自动在网站上登录同一用户,这样他们就不必输入凭据两次?
到目前为止,我希望我可以使用如下所示的内容:
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 功能从一个地方登录用户?(当然不存储用户名/密码)
您无法使用 Firebase ID 令牌登录。您可以执行以下操作:
-
将用户会话保留在 chrome 扩展程序中,并从那里运行所有经过身份验证的请求。使用
postMessage
(通过源验证)在任何时候发送请求时与应用程序的扩展进行通信。这样,您就不必担心会话同步,也不会将 Firebase 令牌存储或传递到网络应用或可以访问该扩展程序的每个网络应用。 -
添加
postMessage
API,以便在验证请求来源后从扩展获取 ID 令牌。然后,可以使用 ID 令牌从 Web 应用发送请求。(不如 1 安全,但更容易实现,会话存储在一个地方)。 -
创建一个采用 ID 令牌并返回自定义令牌的 HTTP 终结点。这将
verifyIdToken
,然后使用管理员 SDK 提供createCustomToken
为该用户创建相应的自定义令牌。然后,在该网络应用中使用该自定义令牌验证来源和signInWithCustomToken
后,您将该postMessage
从 chrome 扩展程序到网页。这是最不安全的,因为您要提供一个端点来与无限期会话交换短期 ID 令牌。您还将处理同步问题(用户从 chrome 扩展程序注销、您必须从网站注销等)。