Javascript signInWithCustomToken firebase-用户未保持登录状态

Javascript signInWithCustomToken firebase-用户未保持登录状态,javascript,firebase,firebase-authentication,Javascript,Firebase,Firebase Authentication,我正在构建一个应用程序(主应用程序),通过一个单独的应用程序(Auth应用程序)进行身份验证。我可以使用CustomToken登录,但在客户端浏览器刷新之间,即使使用AuthStateChanged在使用CustomToken登录后与用户一起运行,身份验证状态也不会持续。 以下是身份验证流程: 用户打开主应用程序,然后单击按钮打开显示Auth应用程序的弹出窗口 window.open(AUTH_URL, 'window', 'width=400,height=600'); 在Auth应用程序

我正在构建一个应用程序(主应用程序),通过一个单独的应用程序(Auth应用程序)进行身份验证。我可以
使用CustomToken登录
,但在客户端浏览器刷新之间,即使
使用AuthStateChanged
使用CustomToken登录后与用户一起运行,身份验证状态也不会持续。
以下是身份验证流程:

  • 用户打开主应用程序,然后单击按钮打开显示Auth应用程序的弹出窗口

    window.open(AUTH_URL, 'window', 'width=400,height=600');
    
  • 在Auth应用程序上,用户使用电子邮件和电子邮件创建Firebase帐户 密码

    firebase.auth().signInWithEmailAndPassword(email, password)
    
  • 身份验证应用程序向身份验证应用程序的服务器发出请求 生成自定义令牌

    //  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);
    };
    
    window.onmessage = (e: MessageEvent) => {
      if (e.origin !== AUTH_URL) { return; }
      const { idToken } = e.data;
      if (!idToken) return;
    
      firebase.auth().signInWithCustomToken(idToken)
    };
    
  • 此自定义令牌通过
    postMessage
    传递回主应用程序

    window.opener.postMessage({ token }, APP_URL);
    window.close();
    
  • 当主应用程序收到身份验证消息时,它会使用自定义令牌让用户登录

    //  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);
    };
    
    window.onmessage = (e: MessageEvent) => {
      if (e.origin !== AUTH_URL) { return; }
      const { idToken } = e.data;
      if (!idToken) return;
    
      firebase.auth().signInWithCustomToken(idToken)
    };
    
  • 我收听
    firebase.auth().onAuthStateChanged
    。此函数使用新用户帐户正确运行,但在刷新页面时不会再次运行。这就好像用户没有被存储在主应用程序的存储器中一样


  • 这似乎是由于意外调用了
    firebase.auth()。不过,我想列举一些项目,以防有人无意中发现这一点

  • 确保您的服务帐户与您在经过身份验证的应用程序上使用的帐户相同。您可以通过Firebase控制台生成管理员服务帐户

  • 发布消息的方法存在问题,黑客可以获取ID令牌,使用它登录,然后执行用户可以执行的所有操作。确保你像我上面所做的那样检查post消息的
    来源
    。可能还可以采取其他措施。我相信这就是典型的“谷歌登录”的工作原理

  • 在媒体上发布了一些关于会话的方法。即

  • 支持这个用例目前是一个悬而未决的问题

  • 快乐编码