Перенаправление при успешном входе в систему с FirebaseUI + React Router

Я использую пакет FirebaseUI React для входа / подписки пользователя. У меня все работает, за исключением того, что я не могу получить перенаправление после успешного входа в систему.

  • StyledFirebaseAuth визуализируется как компонент моего SignIn компонент, который настраивает модель аутентификации FirebaseUI.
  • Компонент SignIn заключен в оболочку withRouter, поэтому, когда я получаю обратный вызов успеха, я могу получить доступ к опоре history и установить значение '/'
  • Я уверен, что вход прошел успешно, поскольку я вижу, что как обратный вызов signInSuccessWithAuthResult, так и мой слушатель onAuthStateChanged срабатывают с положительным результатом.

Обновлено: Кажется, проблема возникает с поставщиком электронной почты / пароля, но при использовании Google в качестве поставщика входа в систему перенаправление работает правильно.

Что я делаю неправильно? это полный файл:

import React from "react";

import firebase from 'firebase/app';
import firebaseApp from '../firebaseApp';
import StyledFirebaseAuth from 'react-firebaseui/StyledFirebaseAuth';

import { withRouter } from "react-router";

// Styles
import styles from '../App.css'; // This uses CSS modules.

class SignIn extends React.Component {
  uiConfig = {
    signInFlow: 'redirect',
    signInOptions: [      
      firebase.auth.GoogleAuthProvider.PROVIDER_ID,
      firebase.auth.FacebookAuthProvider.PROVIDER_ID,
      firebase.auth.EmailAuthProvider.PROVIDER_ID,      
    ],
    callbacks: {
      signInSuccessWithAuthResult: (authResult, redirectUrl) => {
        console.info('signInSuccessWithAuthResult', authResult, redirectUrl);
        this.props.history.push('/');
        return false
      }
    },
  };

  render() {
    return (
      <div>
        <h1>Caazam SignIn</h1>
        <StyledFirebaseAuth uiConfig = {this.uiConfig} firebaseAuth = {firebaseApp.auth()} />        
      </div>
    );
  }
}

export default withRouter(SignIn);

Меняется ли URL-адрес в браузере, но представление не обновляется?

Tomasz Mularczyk 23.05.2018 20:08

Нет, URL-адрес не меняется в браузере.

Shai Ben-Tovim 23.05.2018 20:10

У вас есть консольные ошибки?

Tomasz Mularczyk 23.05.2018 20:11

Ошибок в консоли нет. Я думаю, что это как-то связано с логикой перенаправления по умолчанию в firebaseui (которую я не хочу использовать, поскольку я не ищу перенаправление полной страницы), но не могу понять этого.

Shai Ben-Tovim 23.05.2018 20:12

Хорошо, только что заметил, что он работает, когда я выбираю Google в качестве поставщика входа, но не работает, когда я выбираю адрес электронной почты / пароль в качестве поставщика. Обновлю вопрос.

Shai Ben-Tovim 23.05.2018 20:19

Еще немного покопаемся: похоже, моя проблема вызвана асинхронной последовательностью обратного вызова signInSuccessWithAuthResult и слушателя onAuthStateChanged. При использовании поставщика Google последовательность следующая: обратный вызов, прослушиватель, снова обратный вызов. Когда адрес электронной почты / пароль: обратный вызов, затем слушатель. Что происходит, так это то, что перенаправление действительно работает, но поскольку мой основной прослушиватель аутентификации приложения не «аутентифицирован», он направляется обратно к входу. С точки зрения пользователя это как если бы они остались при входе в систему.

Shai Ben-Tovim 23.05.2018 20:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
6
4 085
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Таким образом, проблема в конечном итоге заключалась в условной маршрутизации в основном компоненте приложения.

Как я уже упоминал в комментариях к вопросу, между перенаправлением (происходящим 1-м) в компоненте SignIn и слушателем onAuthStateChanged в компоненте App (возникающим позже) возникло состояние асинхронной гонки. Когда выполняется перенаправление, слушатель еще не изменил состояние, поэтому условный маршрут к '/' перенаправляется обратно в SignIn.

Решение, которое я нашел, основано на замечательном руководстве Робина Веруха - Полное руководство по аутентификации Firebase в React. Определенно самый исчерпывающий учебник, который я нашел - просто заменил FirebaseUI на «стандартную» аутентификацию Firebase.

По сути, вместо использования условной маршрутизации он использует два отдельных компонента более высокого порядка для аутентификации (передача состояния аутентификации в качестве контекста реакции для всего приложения) и авторизации (защита компонентов и перенаправление пользователей для входа в систему при необходимости).

Я рекомендую создать компонент PrivateRoute, как описано на веб-сайте response-router: https://reacttraining.com/react-router/web/example/auth-workflow

Вот руководство от Тайлера МакГинниса для более подробной информации: https://tylermcginnis.com/react-router-protected-routes-authentication/

Другие вопросы по теме