我正在构建一个react native应用程序,我注意到firebase默认情况下不坚持身份验证状态,因此用户必须在退出应用程序时再次登录。所以我尝试根据他们的文档手动执行,但它似乎不适合我。
这是我尝试设置持久化状态的地方
import { getAuth, signInWithEmailAndPassword, sendPasswordResetEmail, setPersistence, inMemoryPersistence} from 'firebase/auth';
onSignIn(props) {
const auth = getAuth();
const { email, password } = this.state
setPersistence(auth,inMemoryPersistence).then(() => {
if(email.trim().length == 0 && password.trim.length == 0){
Alert.alert(
"",
"Fields can't be empty",
[
{ text: "OK") }
])
}else {
signInWithEmailAndPassword( auth, email, password)
.then((result) => {
})
.catch((error) => {
console.log(error)
})
}
})
}
在这里检查验证状态
componentDidMount() {
firebase.auth().onAuthStateChanged((user) => {
if (!user){
this.setState({
loggedIn: false,
loaded: true,
})
}else {
this.setState({
loggedIn: true,
loaded: true,
})
}
})
请我已经在这几个星期,甚至尝试使用异步存储,但没有一个适合我。在这一点上,我真的需要帮助。谢谢你
对于那些仍然在挣扎的人,我是这样做的:
FirebaseConfig.ts
import { initializeApp} from "firebase/app";
import { initializeAuth, getReactNativePersistence } from "firebase/auth/react-native";
import { getFirestore } from "firebase/firestore";
import AsyncStorage from "@react-native-async-storage/async-storage";
const firebaseConfig = {YOUR CONFIG};
// Initialize Firebase
export const FIREBASE_APP = initializeApp(firebaseConfig);
export const FIREBASE_AUTH = initializeAuth(FIREBASE_APP, {
persistence: getReactNativePersistence(AsyncStorage),
});
export const FIREBASE_DB = getFirestore(FIREBASE_APP);
现在正常使用signInWithEmailAndPassword
函数。没有任何setPersistance
不确定这种方法是否也适用于web,可能不行。
react-native web:
import { signInWithEmailAndPassword, createUserWithEmailAndPassword, setPersistence,browserLocalPersistence} from 'firebase/auth';
import { FIREBASE_AUTH } from '../../FirebaseConfig';
setPersistence(FIREBASE_AUTH, browserLocalPersistence)
参考:https://github.com/firebase/firebase-js-sdk/issues/6050 issuecomment - 1119131377
从inMemoryPersistence
的文档来看,这意味着:
类型为NONE的持久化实现。
关于认证持久性类型的文档指南进一步解释为:
firebase.auth.Auth.Persistence.NONE
'none'
表示该状态将只存储在内存中,当刷新窗口或活动时将被清除。
根据上一个链接,你应该使用:
firebase.auth.Auth.Persistence.LOCAL
'local'
表明状态将保持,即使浏览器窗口关闭或活动在React Native中被销毁。需要一个明确的退出标志来清除该状态。请注意,Firebase认证web会话是单主机源,并且将仅在单个域内持久化。
所以通过检查参考文档,你会想要使用reactNativeLocalPersistence