Я пытаюсь создать приложение в React Native, используя Экспо Го., успешно заработал вход в Google, и все в порядке. К сожалению, логин пользователя НЕ сохраняется между перезапусками приложения. Сначала я подумал, что это проблема с асинхронным хранилищем, но я могу отлично сохранять элементы в хранилище между перезапусками.
Какие данные мне нужно сохранить вручную, чтобы иметь возможность снова входить в систему всякий раз, когда приложение запускается?
Я бы предпочел сохранить данные вручную, так как все методы, которые работают предполагаемый, у меня не работают. Методы, которые я пробовал:
setPersistence(getAuth(), browserLocalPersistence)
выдает ошибку, см. пост это, чтобы узнать точную ошибку, которую я получаю.onAuthStateChanged
также не работает для меня, на самом деле, это основной способ, которым я знаю, когда войти в систему. Пользовательский объект всегда имеет значение null и никогда не меняется с нуля до тех пор, пока пользователь снова не войдет в систему (что происходит при каждом запуске приложения). ).
useEffect(() => getAuth().onAuthStateChanged(value => {
if (value) {
console.info("User is signed in");
} else {
console.info("User is signed out");
// navigation.navigate("login")
}
}), [])
(Этот код всегда будет печатать, что пользователь вышел из системы при перезапуске приложения.)
На данный момент я думаю, что было бы проще, если бы я мог сам сохранить учетные данные пользователя, а затем автоматически входить в них при запуске приложения. Мне трудно найти код для этого.
Вам нужно использовать SecureStore
для сохранения данных на устройстве. Что-то вроде LocalStorage
в Интернете, SharedPreference
в Android и NSUserDefaults
в iOS.
Пример:
// save your thing
async function save(key, value) {
await SecureStore.setItemAsync(key, value);
}
// get your thing
async function getValueFor(key) {
let result = await SecureStore.getItemAsync(key);
if (result) {
alert("? Here's your value ? \n" + result);
} else {
alert('No values stored under that key.');
}
}
Подробнее здесь: https://docs.expo.dev/versions/latest/sdk/securestore/
идея состоит в том, чтобы сохранить JWT из Firebase в SecureStore, поэтому при запуске приложения проверьте это значение, а затем используйте этот JWT в безопасном хранилище при вызове вашего API.
Я ценю эту попытку ответа, но я знаю, как сохранить строки в хранилище. Я специально спрашиваю о том, как сохранить вход в firebase при запуске приложения.
@BernardAllotey идея состоит в том, чтобы сохранить JWT из Firebase в SecureStore, поэтому при запуске приложения проверьте это значение, а затем используйте этот JWT в безопасном хранилище при вызове вашего API.
@ken Как нам справиться с истечением срока действия JWT? Есть ли способ легко обновить JWT по истечении срока его действия?
Итак, я понял, что для сохранения состояния входа в систему вам действительно нужно выполнить специальный процесс, если вы используете expo. Вам нужно инициализировать свою собственную авторизацию, передав асинхронное хранилище, например
import { initializeApp } from "firebase/app"
import { initializeAuth } from "firebase/auth"
import { getReactNativePersistence } from "firebase/auth/react-native"
import AsyncStorage from "@react-native-async-storage/async-storage"
const defaultApp = initializeApp(config);
initializeAuth(defaultApp, {
persistence: getReactNativePersistence(AsyncStorage)
});
Есть идеи, как это должно выглядеть с SDK firebase 9 (с использованием совместимости)?
У меня установлена эта библиотека, мой вопрос в том, какие данные мне нужно сохранить, чтобы пользователь оставался постоянным