Файлы cookie Django HttpOnly не сохраняются в iOS Safari и WebView, но работают в Chrome и Android ITP
Я использую Django для установки HttpOnly и защиты файлов cookie для моего веб-приложения React. Эти файлы cookie отлично работают на устройствах Chrome (как настольных, так и мобильных) и Android.
Однако я столкнулся с серьезной проблемой в iOS:
-iOS Safari: файлы cookie не сохраняются; они обрабатываются как сессионные файлы cookie и удаляются при закрытии браузера.
-iOS React Native WebView: как и в Safari, файлы cookie не сохраняются.
-IOS Chrome: это работает.
-Android React Native WebView: это работает.
MAX_AGE = 60 * 60 * 24 * 360
COMMON = {
"httponly": True,
"secure": True,
"samesite": "None",
"path": "/",
"domain": ".myweb.net",
"max_age": MAX_AGE,
}
def set_auth_cookies(response, access_token: str, refresh_token: str):
response.set_cookie("refresh_token", refresh_token, **COMMON)
response.set_cookie("access_token", access_token, **COMMON)
return response
Я подтвердил, что для параметра max_age задан длительный срок действия, поэтому он не является сеансовым файлом cookie. Похоже, что эта проблема характерна для экосистемы iOS.
Что может быть причиной такого поведения в iOS Safari и WebView, и как я могу убедиться, что эти файлы cookie сохраняются должным образом?
<WebView
ref={webRef}
source={{ uri: WEB_URL }}
style={styles.full}
/* COOKIE PERSIST */
sharedCookiesEnabled
thirdPartyCookiesEnabled
incognito={false}
/* FIX */
javaScriptEnabled
domStorageEnabled
allowsInlineMediaPlayback
allowsFullscreenVideo
mediaCapturePermissionGrantType="grant"
startInLoadingState
cacheEnabled={false}
injectedJavaScriptBeforeContentLoaded={INJECT_BEFORE}
injectedJavaScriptBeforeContentLoadedForMainFrameOnly={false}
onMessage={handleWebViewMessage}
onLoadEnd={() => {
setLoadedOnce(true);
lastLoadEndAt.current = Date.now();
failCount.current = 0;
if (healthTimer.current) {
clearTimeout(healthTimer.current);
healthTimer.current = null;
}
}}
onContentProcessDidTerminate={() => webRef.current?.reload()}
onRenderProcessGone={() => webRef.current?.reload()}
onShouldStartLoadWithRequest={() => true}
setSupportMultipleWindows={false}
onError={() => setTimeout(() => webRef.current?.reload(), 300)}
renderError={({ description }) => <Text style={styles.err}>⚠️ {description}</Text>}
onHttpError={(e) =>
console.log("HTTP", e.nativeEvent.statusCode, e.nativeEvent.description)
}
/>
Что может быть причиной такого поведения в iOS Safari и WebView, и как я могу убедиться, что эти файлы cookie сохраняются должным образом?