Reactjs 登录后立即显示缺少权限错误消息
我在登录我的应用程序时出现“未捕获的FirebaseError:缺少或权限不足”错误。登录后立即重定向时出现问题。我目前没有错误边界,因此在web控制台中会出现带有此错误消息的空白白色屏幕 我用的是火图书馆 下面是一些代码: 我的切入点:(index.tsx)Reactjs 登录后立即显示缺少权限错误消息,reactjs,typescript,firebase,firebase-authentication,reactfire,Reactjs,Typescript,Firebase,Firebase Authentication,Reactfire,我在登录我的应用程序时出现“未捕获的FirebaseError:缺少或权限不足”错误。登录后立即重定向时出现问题。我目前没有错误边界,因此在web控制台中会出现带有此错误消息的空白白色屏幕 我用的是火图书馆 下面是一些代码: 我的切入点:(index.tsx) createRoute(document.getElementById('root')!).render( ); 然后根据身份验证重定向到signin或dashboard的包装器: export const Wrapper=()=>;
createRoute(document.getElementById('root')!).render(
);
然后根据身份验证重定向到signin或dashboard的包装器:
export const Wrapper=()=>;
“我的登录”页面的重要部分是“登录”按钮:
auth.signInWithEmailAndPassword(电子邮件,密码)}>
登录
当我点击按钮时,由于获取用户和验证密码等原因导致了一个小的延迟(我应该稍后在那里加载,但这目前不是问题)。然后,页面变为白色,控制台中出现错误
导致错误的页面是仪表板页面。下面是导致错误的代码:
const user=useUser();
console.log('id',user.uid);//没关系
const accountRef=useFirestore().collection('users').doc(user.uid);
const account=useFirestoreDocDataOnce(accountRef);
console.log('account',account);//也可以
const companyRef=useFirestore().collection('companys').doc(account.company);
const contractsCollectionRef=companyRef.collection(“合同”);
const contracts=useFirestoreCollectionData(contractsCollectionRef,{idField:'id'});
console.log(合同);//从未显示
需要注意的重要一点是,如果我刷新页面,那么AuthCheck会将我直接带到仪表板,并且一切都正常工作
当我登录时,你知道我应该怎么做才能让它工作吗
它不适用于reactfire中的useUser()和useAuth()。它也不会从firebase中对()进行身份验证
编辑
作为临时补丁,我可以将登录按钮的onClick方法更改为:
()=>使用电子邮件和密码(电子邮件,密码)进行身份验证登录。然后(()=>window.location.reload())
它的速度足够快,刷新后,一切正常。但我认为最好不要重新加载
编辑2
使用react路由器库时,同样的问题仍然存在
索引
单击“登录”按钮:
onClick={() => auth.signInWithEmailAndPassword(email, password).then(() => history.push('/dashboard'))}
当我添加一个路由系统(react router dom)时,我终于修复了它 . 索引
我在登录时向dashboard添加了重定向,在注销时向signIn添加了重定向
我将必须找到一种方法来处理自动注销,如果不登录,而在一个安全的页面。但据我所知,我们不能直接依赖useAuth,也不能依赖于比显示组件更复杂的路由。如果您拨打的电话需要经过身份验证才能工作,那么最好使用真正的路由系统
编辑
若要自动重定向到登录页面并记住您所在的位置,您可以替换
与
{
用户
?//所有安全路由
:
}
其中
user
是useUser()。看
此处提到了一种可能的方法,建议在注销后立即调用以下函数:
export const clearFirestoreCache=()=>{
const map=全局此[''反应火重加载可观测值'];
Array.from(map.keys()).forEach(
(key)=>key.includes('firestore')&&map.delete(key),
);
};
今天我也看到了同样的情况。我还没有找到解决方案,所以如果你找到了,如果你能与我分享,我将不胜感激@AlfEaton@AlfEaton我贴出了答案。不确定它是否对你的情况有帮助。