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

时间:2021-05-25 23:22:53

标签: javascript firebase firebase-authentication

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

  1. 用户打开主应用程序,然后单击一个按钮以打开一个显示身份验证应用程序的弹出窗口。

    window.open(AUTH_URL, 'window', 'width=400,height=600');
    
  2. 在 Auth App 上,用户创建一个带有电子邮件和 密码。

    firebase.auth().signInWithEmailAndPassword(email, password)
    
  3. 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);
    };
    
  4. 此自定义令牌通过 postMessage 传递回主应用程序。

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

    window.onmessage = (e: MessageEvent) => {
      if (e.origin !== AUTH_URL) { return; }
      const { idToken } = e.data;
      if (!idToken) return;
    
      firebase.auth().signInWithCustomToken(idToken)
    };
    
  6. 我听firebase.auth().onAuthStateChanged。此功能使用新用户帐户正确运行,但在我刷新页面时不会再次运行。就好像用户没有被存储在主应用程序的存储中。

1 个答案:

答案 0 :(得分:0)

这似乎是由意外调用 firebase.auth().signOut() 的无关错误引起的。但是,我想列出一些项目,以防有人偶然发现。

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

  2. 发布消息方法存在问题,黑客可以获取 ID 令牌,使用它登录,然后执行用户可以执行的所有操作。确保像我上面那样检查帖子消息的 origin。可能还可以采取其他措施。我相信这就是典型的“使用 Google 登录”的工作方式。

  3. 有些方法已经发布在 Medium 上。即 https://dev.to/johncarroll/how-to-share-firebase-authentication-across-subdomains-1ka8https://dev.to/brianburton/cross-domain-firebase-authentication-a-simple-approach-337k

  4. 支持此用例目前是一个悬而未决的问题 https://github.com/firebase/firebase-js-sdk/issues/2303

快乐编码!