Expo sdk 29/30: файл cookie сеанса из входа

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

Это работало с Expo v28. Но когда я обновился до Expo 30, сервер больше не видит клиента как вошедшего в систему. Нужно ли мне менять способ использования выборки? Мне нужно передать какие-то дополнительные параметры?

Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
0
950
1

Ответы 1

Во-первых, перед входом в систему нам нужно очистить старые файлы 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. Это подходящее решение может быть полезно другим.

Другие вопросы по теме