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