reactjs - 使用 FirebaseUI + React Router 成功登录时重定向
问题描述
我正在使用FirebaseUI React包进行用户登录/注册。除了成功登录后无法获得重定向之外,我一切正常。
StyledFirebaseAuth
呈现为SignIn
配置 FirebaseUI Auth 模型的组件的一个组件。- 该
SignIn
组件被包装,withRouter
因此当我收到成功回调时,我可以访问该history
道具并设置为“/” - 我确信登录是成功的,因为我看到
signInSuccessWithAuthResult
回调和我的onAuthStateChanged
监听器都触发了一个积极的结果。
编辑:电子邮件/密码提供商似乎出现问题,但是当使用谷歌作为登录提供商时,重定向工作正常。
我究竟做错了什么?这是完整的文件:
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.log('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);
解决方案
所以问题最终出在主 App 组件中的条件路由上。
正如我在对问题的评论中提到的那样,SignIn 组件中的重定向(第一次发生)和onAuthStateChanged
App 组件中的侦听器(稍后发生)之间存在异步竞争条件。当进行重定向时,侦听器尚未更改状态,因此到 '/' 的条件路由被重定向回 SignIn。
我找到的解决方案基于 Robin Wieruch 的精彩教程 - React Authentication Tutorial 中的完整 Firebase。绝对是我发现的最全面的教程 - 只需将 FirebaseUI 换成“标准”Firebase 身份验证。
基本上,它不使用条件路由,而是使用两个单独的高阶组件进行身份验证(将身份验证状态作为反应上下文传递给整个应用程序)和授权(保护组件并在需要时重定向用户登录)。
推荐阅读
- amazon-web-services - 如何在 Terraform 中使用 AWS Backup 在不同区域创建文件库?
- symfony - 作曲家安装/更新触发器类 Doctrine\Common\Cache\ArrayCache 不存在
- angular - 将`Encrypted`文件上传到Azure容器并在另一端`Decrypt` - 使用Angular
- javascript - 删除重复行、工作表和谷歌脚本的功能
- blazor - Childcomponent 到另一个 ChildComponent 的 EventCallback,:Blazor
- php - 如何从 JSON 中检索值
- javascript - 滚动时倾斜文本,如何定位类而不是部分
- python - [接触:
我面临“显示第 0 - 0 行(共 1 行,查询耗时 0.0027 秒。)[联系人:<BOUND MET... - <BOUND MET...]”而不是联系电话。以下是代码任何人都可以帮我解决这个问题吗?
如果输入了相同的电子邮件,这是输出!!!(4, 'q', 'q', '<bound met', 'q', 'Your Firs
- postgresql - 找出连续聚合的大小
- vue.js - 解析错误:Vue.js 中缺少分号