我有一个服务器端代码,使用 express.js 来处理会话和 cookie; 对于我的客户端代码,我使用 axios 来帮助管理 cookie 和会话:
服务器端代码(express.js):
app.use(cors({
origin: ["www.1.com", "www.2.com", "www.3.com"],
credentials: true,
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'],
methods: ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS'],
preflightContinue: true
}))
app.set('trust proxy', 1)
app.use(cookieParser("cookie-secret"))
app.use(session({
secret: "cookie-secret",
resave: false,
saveUninitialized: process.env.NODE_EV==="production",
store: MongoStore.create({
mongoUrl: "url",
autoRemove:'interval',
autoRemoveInterval: 10
}),
cookie: {
secure: true,
httpOnly: true,
sameSite: 'none',
maxAge: 1000 * 60 * 60 * 24
}
}));
客户端代码(axios):
import axios from 'axios'
const instance = axios.create({
baseURL: process.env.REACT_APP_BACKEND_URL,
headers: { 'Content-Type': 'application/json' },
withCredentials: true,
});
export default instance;
客户端代码(使用):
import instance from '../axiosAPI';
useEffect(() => {
async function fetchQR() {
try {
const response = await instance.get("url");
setItems(response?.data?.data || []);
setLoaded(true);
} catch (error) {
console.log(error);
}
}
fetchQR();
}, []);
当我在 Android 设备上运行代码时,它工作正常;然而,一旦在 iPhone 上测试,它似乎不起作用......
在检查客户端发送的请求时,cookie和session都被记录下来,但它并没有在标头中发送cookie:
前端代码:
来自Android/Windows的请求:
"headers": {
"accept": "application/json, text/plain, */*",
"accept-encoding": "gzip",
"accept-language": "en-GB,en;q=0.9,en-US;q=0.8",
"cdn-loop": "ye",
"cf-connecting-ip": "1.1.1.1",
"cf-ew-via": "15",
"cf-ipcountry": "AU",
"cf-ray": "7f95c282c5a72efa-MEL",
"cf-visitor": "{\"scheme\":\"https\"}",
"cf-worker": "serverbackend.com",
"content-length": "18",
"content-type": "application/json",
"cookie": "connect.sid=gomgom",
"host": "www.serverbackend.com",
"origin": "www.1.com",
"priority": "u=1, i",
"referer": "www.1.com",
"render-proxy-ttl": "4",
"sec-ch-ua": "\"Not/A)Brand\";v=\"99\", \"Microsoft Edge\";v=\"115\", \"Chromium\";v=\"115\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"true-client-ip": "1.1.1.1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203",
"x-forwarded-for": "2.2.2.2, 3.3.3.3, 4.4.4.4",
"x-forwarded-proto": "https",
"x-request-start": "1692483374752209"
},
"session": {
"auth": {
"email": "[email protected]",
"user_id": "63d61ea63b02b90e9fa6006b",
"username": "newnew"
},
"cookie": {
"expires": "2023-08-20T21:48:51.458Z",
"httpOnly": true,
"originalMaxAge": 86400000,
"path": "/",
"sameSite": "none",
"secure": true
}
},
"sessionID": "DQfeslKPa8nSiJ5zdaJCuSc2RzXtztRw"
}
来自 iPhone 的请求:
"headers": {
"accept": "application/json, text/plain, */*",
"accept-encoding": "gzip",
"accept-language": "en-US,en;q=0.9",
"cdn-loop": "ye",
"cf-connecting-ip": "1.1.1.1",
"cf-ew-via": "15",
"cf-ipcountry": "US",
"cf-ray": "7f95c8cdb19e8214-IAD",
"cf-visitor": "{\"scheme\":\"https\"}",
"cf-worker": "serverbackend.com",
"host": "www.serverbackend.com",
"origin": "www.1.com",
"referer": "www.1.com",
"render-proxy-ttl": "4",
"true-client-ip": "1.1.1.1",
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1",
"x-forwarded-for": "2.2.2.2, 3.3.3.3, 4.4.4.4",
"x-forwarded-proto": "https",
"x-request-start": "1692483632436366"
},
"session": {
"cookie": {
"expires": "2023-08-20T22:20:32.440Z",
"httpOnly": true,
"originalMaxAge": 86400000,
"path": "/",
"sameSite": "none",
"secure": true
}
},
"sessionID": "N5Mo3R9keK3coTYMmjoZVqxIUi18vM_g",
}
我在渲染上运行服务器端代码(https://render.com/),我的客户端代码托管在(https://www.netlify.com/)。
有人知道问题是什么并且可以指出我正确的方向吗?
非常感谢您的宝贵时间
我也遇到同样的问题,请问有解决办法吗?