# #javascript #firebase #firebase-authentication
Вопрос:
Я создаю приложение (основное приложение), которое аутентифицируется через отдельное приложение (приложение аутентификации). Я могу signInWithCustomToken
, но состояние аутентификации не сохраняется между обновлениями браузера клиента, даже если onAuthStateChanged
после этого запускается с пользователем signInWithCustomToken
. Ниже приведен процесс аутентификации:
- Пользователи открывают основное приложение и нажимают кнопку, чтобы открыть всплывающее окно, в котором отображается приложение аутентификации.
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); };
- Этот пользовательский токен передается обратно в основное приложение через a
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
. Эта функция корректно запускается с новой учетной записью пользователя, но НЕ запускается снова при обновлении страницы. Это похоже на то, как если бы пользователь не хранился в хранилище основного приложения.
Ответ №1:
Похоже, это было вызвано несвязанной ошибкой, из — за которой firebase.auth().signOut()
неожиданно был вызван вызов. Однако я хотел бы назвать несколько пунктов на случай, если кто-то наткнется на это.
- Убедитесь, что ваша учетная запись службы совпадает с той, которую вы используете в своем аутентифицированном приложении. Вы можете создать учетную запись службы администратора с помощью консоли Firebase.
- Подход к отправке сообщений имеет проблемы, когда хакер может захватить идентификационный токен, войти с его помощью, а затем выполнить все действия, которые могут выполнять пользователи. Убедитесь, что вы проверили
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
Счастливого кодирования!