React native Expo sdk 29/30:来自登录的会话cookie

React native Expo sdk 29/30:来自登录的会话cookie,react-native,expo,React Native,Expo,在Expo的所有早期版本中,我都使用RN fetch方法将用户名/密码发布到Flask登录端点。此终结点将用户信息保存到会话并设置会话cookie。它总是透明的,我从不需要通过任何额外的东西 从第28届世博会开始,这项工作就开始了。但是当我升级到Expo 30时,服务器不再认为客户端已登录。我是否需要更改使用fetch的方式?我需要传递一些额外的参数吗?首先,在登录之前,我们需要使用以下方法清除旧cookie: import { NativeModules } from 'react-nativ

在Expo的所有早期版本中,我都使用RN fetch方法将用户名/密码发布到Flask登录端点。此终结点将用户信息保存到会话并设置会话cookie。它总是透明的,我从不需要通过任何额外的东西


从第28届世博会开始,这项工作就开始了。但是当我升级到Expo 30时,服务器不再认为客户端已登录。我是否需要更改使用fetch的方式?我需要传递一些额外的参数吗?

首先,在登录之前,我们需要使用以下方法清除旧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解析器解析服务器在“set-cookie”响应头中发送的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.log(cookies); // array
    // Save cookies array to SecureStore or AsyncStorage
}
最后,对于所有需要会话cookie的服务器请求,我们将cookie发送到fetch头中

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进行了测试。这是一个对我有用的解决方案,可能对其他人有用