我正在构建一个应用程序(主应用程序),它通过一个单独的应用程序(身份验证应用程序)进行身份验证。我能够signInWithCustomToken
,但即使onAuthStateChanged
在signInWithCustomToken
之后与用户一起运行,客户端浏览器刷新之间的身份验证状态也不会持续。
以下是身份验证流程:
用户打开主应用程序,然后单击一个按钮以打开一个显示身份验证应用程序的弹出窗口。
window.open(AUTH_URL, 'window', 'width=400,height=600');
在 Auth App 上,用户创建一个带有电子邮件和 密码。
firebase.auth().signInWithEmailAndPassword(email, password)
Auth App 向 Auth App 的服务器发出请求 生成自定义令牌。
// client side code
const idToken = await firebase.auth().currentUser.getIdToken()
const token = api.generateTokenAPIRequest(idToken);
// server side code
const generateTokenAPIRequest = (idToken) => {
const { uid } = await admin.auth().verifyIdToken(idToken);
return await admin.auth().createCustomToken(uid);
};
此自定义令牌通过 postMessage
传递回主应用程序。
window.opener.postMessage({ token }, APP_URL);
window.close();
当主应用收到身份验证消息时,它会使用自定义令牌让用户登录。
window.onmessage = (e: MessageEvent) => {
if (e.origin !== AUTH_URL) { return; }
const { idToken } = e.data;
if (!idToken) return;
firebase.auth().signInWithCustomToken(idToken)
};
我听firebase.auth().onAuthStateChanged
。此功能使用新用户帐户正确运行,但在我刷新页面时不会再次运行。就好像用户没有被存储在主应用程序的存储中。
答案 0 :(得分:0)
这似乎是由意外调用 firebase.auth().signOut()
的无关错误引起的。但是,我想列出一些项目,以防有人偶然发现。
确保您的服务帐户与您在经过身份验证的应用上使用的帐户相同。您可以通过 Firebase 控制台生成管理员服务帐号。
发布消息方法存在问题,黑客可以获取 ID 令牌,使用它登录,然后执行用户可以执行的所有操作。确保像我上面那样检查帖子消息的 origin
。可能还可以采取其他措施。我相信这就是典型的“使用 Google 登录”的工作方式。
有些方法已经发布在 Medium 上。即 https://dev.to/johncarroll/how-to-share-firebase-authentication-across-subdomains-1ka8 和 https://dev.to/brianburton/cross-domain-firebase-authentication-a-simple-approach-337k
支持此用例目前是一个悬而未决的问题 https://github.com/firebase/firebase-js-sdk/issues/2303
快乐编码!