刷新页面时,客户端 Firebase 似乎认为我有经过身份验证的用户,但 firestore firebase 规则暗示我没有经过身份验证的用户。
我有一个 Firebase 应用程序,用户通过 signInWithEmailAndPassword 使用电子邮件和密码登录。我将持久性设置为 browserLocalPersistence。通常,当用户登录时,会使用经过身份验证的用户对象调用 onAuthStateChanged 方法,并且应用程序可以正常运行。当用户刷新页面时,我的 onAuthStateChanged 方法会再次使用非空用户触发,但由于我的安全规则,所有 Firebase 查询都会失败。我在那里做错了什么。
这是一个reactjs应用程序。如果我可以提供任何其他可能会给您带来启发的答案,请告诉我。
我的 firebase 规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if isAuthenticated();
}
function isAuthenticated() {
return request.auth != null && request.auth.uid != null;
}
}
}
我的登录代码:
setPersistence(sharedFirebaseAuth, browserLocalPersistence)
.then(() => {
signInWithEmailAndPassword(sharedFirebaseAuth, email, password)
.then((userCredential) => {
})
.catch((error) => {
});
})
我的 onAuthStateChanged 代码
onAuthStateChanged(sharedFirebaseAuth, (user) => {
if(user){
user.reload().then(()=>{
requestDocs();
});
}
}) Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我想你忘记了
read和write之间的逗号,应该看起来像allow read, write: if isAuthenticated();我最终不得不实现一个身份验证提供程序,以便它保留我的用户信息。
新文件 AuthContext.tsx
import React from "react" import { User } from "firebase/auth"; export const AuthContext = React.createContext(null) 新文件 AuthProvider.tsx
import { FC, useEffect, useState } from "react"; import { User } from "firebase/auth"; import { sharedFirebaseAuth } from "../Utils/SharedFirebase"; import { AuthContext } from "./AuthContext"; export interface AuthProviderProps { children: JSX.Element; } export const AuthProvider: FC = ({ children }: AuthProviderProps) => {
const [user, setUser] = useState(null);
useEffect(() => {
const unsubscribe = sharedFirebaseAuth.onAuthStateChanged((firebaseUser) => {
setUser(firebaseUser);
});
return unsubscribe
}, []);
return (
{children}
);
}; 然后我像这样更新了我的index.tsx
import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; import { AuthProvider } from './provider/AuthProvider'; import "bootstrap/dist/css/bootstrap.min.css"; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement ); root.render(
);然后将我调用 onAuthStateChanged 的 app.tsx 部分更新为以下内容
const user = useContext(AuthContext); useEffect(() => { if(user){ requestDocs(); } },[user]);刷新后,它似乎保留了所有必要的身份验证信息来提取文档。