Вход с помощью firebase Customtoken — пользователь не входит в систему

# #javascript #firebase #firebase-authentication

Вопрос:

Я создаю приложение (основное приложение), которое аутентифицируется через отдельное приложение (приложение аутентификации). Я могу signInWithCustomToken , но состояние аутентификации не сохраняется между обновлениями браузера клиента, даже если onAuthStateChanged после этого запускается с пользователем signInWithCustomToken . Ниже приведен процесс аутентификации:

  1. Пользователи открывают основное приложение и нажимают кнопку, чтобы открыть всплывающее окно, в котором отображается приложение аутентификации.
     window.open(AUTH_URL, 'window', 'width=400,height=600');
     
  2. В приложении Auth пользователи создают учетную запись Firebase с электронной почтой и
    паролем.

     firebase.auth().signInWithEmailAndPassword(email, password)
     
  3. Приложение аутентификации отправляет запрос на сервер приложения аутентификации для
    создания пользовательского токена.

     //  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. Этот пользовательский токен передается обратно в основное приложение через a 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:

Похоже, это было вызвано несвязанной ошибкой, из — за которой firebase.auth().signOut() неожиданно был вызван вызов. Однако я хотел бы назвать несколько пунктов на случай, если кто-то наткнется на это.

  1. Убедитесь, что ваша учетная запись службы совпадает с той, которую вы используете в своем аутентифицированном приложении. Вы можете создать учетную запись службы администратора с помощью консоли Firebase.
  2. Подход к отправке сообщений имеет проблемы, когда хакер может захватить идентификационный токен, войти с его помощью, а затем выполнить все действия, которые могут выполнять пользователи. Убедитесь, что вы проверили origin текст сообщения, как я сделал выше. Существуют дополнительные меры, которые, вероятно, могут быть приняты. Я считаю, что именно так работает типичный «Вход в систему с помощью Google».
  3. Существуют подходы к сеансам, которые были опубликованы на 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
  4. Поддержка этого варианта использования в настоящее время является открытой проблемой https://github.com/firebase/firebase-js-sdk/issues/2303

Счастливого кодирования!