javascript - React - Firebase 使用单独的身份验证类处理身份验证持久性
问题描述
我正在构建一个使用简单登录功能的反应应用程序。我只使用谷歌登录,并且正在调用该signInWithPopop
函数来处理它。我创建了一个单独的类来处理所有与身份验证相关的代码。在我网站的导航栏上,如果用户未登录,我有一个登录按钮,当用户登录时,它会切换到个人资料按钮。
这就是我目前检查用户是否登录(不工作)的方式:
console.log(authHandler.getUser());
const[loginState, setLogin] = useState(authHandler.getUser()? true : false);
return(
<div className="navbar">
<div className="nav-options">
<NavItem name="About"></NavItem>
<NavItem name="Listings"></NavItem>
<NavItem name="Dashboard"></NavItem>
{loginState ? <NavItem name="Profile"><DropDown loginState={setLogin}></DropDown></NavItem> : <NavItem name="Login" click={() => authHandler.signIn(setLogin)}></NavItem>}
</div>
</div>
);
这就是我的 authHandler 类:
import firebase from 'firebase';
export default class Auth{
constructor(){
var firebaseConfig = {
...
};
!firebase.apps.length? firebase.initializeApp(firebaseConfig) : firebase.app();
firebase.analytics();
this.provider = new firebase.auth.GoogleAuthProvider();
}
signIn(state){
firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION).then(() => {
return firebase.auth().signInWithPopup(this.provider).then((result) => {
console.log("signed in " + result.user.uid);
this.user = result.user
state(true);
}).catch((error) => {
console.log(error.message);
});
}).catch((error) => {
console.log(error.message);
})
}
getUser(){
return firebase.auth().currentUser;
}
logout(state){
//TODO: logout of firebase
state(false);
}
}
我尝试在 firebase 上添加会话和本地持久性,但是当我刷新页面时,用户已注销。在这样的单独课程中,保持持久性的正确方法是什么?我正在尝试以最佳实践来构建此应用程序,以便正确拆分代码并维护安全性。
谢谢!
解决方案
每当用户的登录状态发生变化时,您都应该使用身份验证状态观察器来获取回调。首次加载页面时,始终会立即将用户视为已退出。回调将在用户的令牌从持久性加载并验证后不久被调用。使用此状态回调来确定要呈现的内容。
firebase.auth().onAuthStateChanged((user) => {
if (user) {
// User is signed in, see docs for a list of available properties
// https://firebase.google.com/docs/reference/js/firebase.User
var uid = user.uid;
// ...
} else {
// User is signed out
// ...
}
});
您可能希望显示加载屏幕,直到第一个回调确定用户之前是否已登录或已明确退出。
我建议阅读此内容以获取更多信息。
推荐阅读
- java - 如何使用 Selenium 实现键盘自动化
- c++ - 运行时检查失败 #4 - 此函数保留的 _alloca 内存周围的堆栈区域已损坏?
- asp.net-mvc - 向 InsertionMode 枚举添加附加值
- ios - Swift核心数据NSFetchRequest谓词获取日期时间
- discord.js - Discord js将另一个机器人嵌入的附加图像和描述复制到另一个频道
- python - 如何使用 _OptionsDataset 进行数据扩充?
- css - CSS,Flexbox 大小问题。有人可以解释发生了什么吗?
- mysql - 查询多个计数
- reactjs - 在 onClick 事件上使用多个 if 语句进行表单验证
- java - 运输基准的不同结果