Секреты: expo-secure-store
AsyncStorage не шифрует данные, поэтому токены входа и другие секреты в нём держать нельзя. Модуль expo-secure-store сохраняет строки в защищённом хранилище системы: на iOS — в Keychain, на Android — с шифрованием ключом из Android Keystore.
Установка
В проекте блога выполните:
npx expo install expo-secure-storeМодуль работает в Expo Go на телефоне и в эмуляторе. В браузере его нет.
Методы
| Метод | Что делает |
|---|---|
SecureStore.setItemAsync(key, value) | Сохраняет строку |
SecureStore.getItemAsync(key) | Возвращает строку или null |
SecureStore.deleteItemAsync(key) | Удаляет значение |
Ключ может содержать только латинские буквы, цифры и символы ., -, _.
Модуль для токена
Представим, что после входа сервер выдал токен — строку, которую нужно отправлять с каждым запросом. Создайте файл:
// lib/auth.ts
import * as SecureStore from 'expo-secure-store';
const KEY = 'auth_token';
export function saveToken(token: string) {
return SecureStore.setItemAsync(KEY, token);
}
export function getToken() {
return SecureStore.getItemAsync(KEY);
}
export function deleteToken() {
return SecureStore.deleteItemAsync(KEY);
}Все три функции возвращают промисы, как и в AsyncStorage.
Использование на экране профиля
// app/(tabs)/profile.tsx
import { useEffect, useState } from 'react';
import { Button, Text, View } from 'react-native';
import { deleteToken, getToken, saveToken } from '@/lib/auth';
export default function Profile() {
const [token, setToken] = useState<string | null>(null);
useEffect(() => {
getToken().then(setToken);
}, []);
async function logIn() {
await saveToken('demo-token-123');
setToken('demo-token-123');
}
async function logOut() {
await deleteToken();
setToken(null);
}
return (
<View style={{ flex: 1, padding: 16, gap: 12 }}>
<Text>{token ? 'Вы вошли' : 'Вы не вошли'}</Text>
{token ? <Button title="Выйти" onPress={logOut} /> : <Button title="Войти" onPress={logIn} />}
</View>
);
}Нажмите «Войти», закройте приложение и откройте снова — вкладка «Профиль» по-прежнему покажет «Вы вошли». «Выйти» удалит токен из хранилища.
Что куда класть
| Данные | Хранилище |
|---|---|
| Токены, пароли, ключи | expo-secure-store |
| Настройки, черновики, кеш | AsyncStorage |
| Много записей с поиском | expo-sqlite |
Защищённое хранилище рассчитано на небольшие значения — около 2 КБ на ключ, поэтому большие объекты в него не кладут.
Частая ошибка
Сохранять пароль пользователя, чтобы потом входить автоматически. Даже в защищённом хранилище пароль — лишний риск. Храните токен, который выдал сервер: его можно отозвать, и он не откроет другие сервисы, где человек использует тот же пароль.