Во всех предыдущих версиях Expo я использовал метод выборки RN для отправки имени пользователя / пароля POST в конечную точку входа в Flask. Эта конечная точка сохранила информацию о пользователе в сеансе и установила файл cookie сеанса. Он всегда был прозрачным, и мне никогда не приходилось пропускать ничего лишнего.
Это работало с Expo v28. Но когда я обновился до Expo 30, сервер больше не видит клиента как вошедшего в систему. Нужно ли мне менять способ использования выборки? Мне нужно передать какие-то дополнительные параметры?





Во-первых, перед входом в систему нам нужно очистить старые файлы cookie, используя:
import { NativeModules } from 'react-native'
const Networking = NativeModules.Networking;
Networking.clearCookies((cleared) => {
console.debug('cleared hadCookies: ' + cleared.toString());
ApiUtils.login(your_login_parameters); // your login function
});
Мы должны очистить файлы cookie, потому что собственный менеджер файлов cookie отправляет устаревшие файлы cookie. Теперь мы сами будем управлять файлом cookie.
В моем обработчике входа я использую set-cookie-parser для анализа файлов cookie, отправленных сервером в заголовке ответа set-cookie.
import setCookie from 'set-cookie-parser';
// insider my login handler
const response = await fetch(login_endpoint, credentials_payload);
let cookies, cookieHeader, serverData;
if (response.ok) {
serverData = await response.json();
cookieHeader = setCookie.splitCookiesString(response.headers.get('set-cookie'));
cookies = setCookie.parse(cookieHeader);
console.info(cookies); // array
// Save cookies array to SecureStore or AsyncStorage
}
Наконец, для всех запросов к серверу, требующих файла cookie сеанса, мы отправляем файл cookie в заголовках выборки.
const makeFetchParams = (form_data) => {
const cookies = get_from_storage_of_choice // SecureStore or AsyncStorage
const c_arr = cookies.map(d => { return d.name+'='+d.value; });
const cookieStr = c_arr.join(';');
return {
method: 'POST',
credentials: 'omit',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'cookie': cookieStr
},
body: form_data
};
};
// inside endpoints that require the session cookie
const response = await fetch(your_url, makeFetchParams(some_form_data));
Я тестировал это с помощью Expo SDK v30 и Android. Это подходящее решение может быть полезно другим.