Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Секреты: 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 КБ на ключ, поэтому большие объекты в него не кладут.

Частая ошибка

Сохранять пароль пользователя, чтобы потом входить автоматически. Даже в защищённом хранилище пароль — лишний риск. Храните токен, который выдал сервер: его можно отозвать, и он не откроет другие сервисы, где человек использует тот же пароль.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.