Networking docs appear outdated: credentials: 'omit' works on RN 0.86
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 1/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 78/100
- Loại issue
- Tài liệu
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Ít trao đổi
- Công nghệ
- react-native
- Lĩnh vực
- documentation
Hướng nghiên cứu
Bắt đầu với phần tài liệu Networking được liên kết trong báo cáo, đặc biệt là nội dung về các vấn đề đã biết đối với fetch và xác thực dựa trên cookie. Cập nhật nhận định về thông tin xác thực: «omit» để phù hợp với hành vi được báo cáo của React Native 0.86, đồng thời để giới hạn redirect: 'manual' ngoài phạm vi; công việc được xem là hoàn tất khi cảnh báo đã lỗi thời được xóa bỏ hoặc thu hẹp một cách phù hợp.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
The Networking docs list credentials: 'omit' as currently not working with fetch:
https://reactnative.dev/docs/network#known-issues-with-fetch-and-cookie-based-authentication
On React Native 0.86, the built-in global fetch respects credentials: 'omit' in all cookie scenarios tested on both iOS and Android:
- existing cookies are not sent on direct requests;
- existing cookies are not sent after an automatically followed
302; Set-Cookiefrom a direct response is not persisted;Set-Cookiefrom a302response is neither sent to the redirected request nor persisted.
Equivalent credentials: 'include' controls all behave in the opposite way, confirming that the cookie store and test server are working.
The other documented limitation, redirect: 'manual', is outside the scope of this report.
Environment
react-nativepackage: 0.86.2- Native runtime reported by
Platform.constants.reactNativeVersion: 0.86.0 - Expo: 57.0.9, Expo Go
- iOS: 26.5 simulator
- Android: API 37 emulator
- Fetch implementation: React Native built-in global
fetchEXPO_PUBLIC_USE_RN_FETCH=1- confirmed
global fetch !== expo/fetch
Expo SDK 57 documents EXPO_PUBLIC_USE_RN_FETCH=1 as the switch that keeps React Native's built-in fetch as the global implementation:
https://docs.expo.dev/versions/v57.0.0/sdk/expo/#expofetch-api
Reproduction
The test server provides these endpoints:
/api/set-cookie— responds withSet-Cookie: session=abc123andtheme=dark;/api/cookies— returns the receivedCookieheader;/api/redirect-to-cookies—302to/api/cookies;/api/redirect-set-cookie— responds with both302andSet-Cookie, redirecting to/api/cookies;/api/clear-test-cookies— expires all cookies used by the test.
The relevant client checks are equivalent to:
// Existing cookies: direct requests and automatic 302 follow
await clearTestCookies();
await fetch(`${API}/api/set-cookie`, { credentials: 'include' });
assert((await readCookies('include')).cookieHeader ===
'session=abc123; theme=dark');
assert((await readCookies('omit')).cookieHeader === null);
assert((await fetchRedirect('include')).cookieHeader ===
'session=abc123; theme=dark');
assert((await fetchRedirect('omit')).cookieHeader === null);
// A direct Set-Cookie response must be ignored with omit
await clearTestCookies();
await fetch(`${API}/api/set-cookie?scenario=direct-omit-response`, {
credentials: 'omit',
});
assert((await readCookies('include')).cookieHeader === null);
// Control: the same operation with include persists the cookie
await clearTestCookies();
await fetch(`${API}/api/set-cookie?scenario=direct-include-response`, {
credentials: 'include',
});
assert((await readCookies('include')).cookieHeader ===
'direct_include_response=should_persist');
// Set-Cookie received on a 302 must also be ignored with omit
await clearTestCookies();
const redirectedOmit = await fetch(
`${API}/api/redirect-set-cookie?scenario=redirect-omit-response`,
{ credentials: 'omit' },
);
assert((await redirectedOmit.json()).cookieHeader === null);
assert((await readCookies('include')).cookieHeader === null);
// Control: include sends the new cookie on the redirected request and persists it
await clearTestCookies();
const redirectedInclude = await fetch(
`${API}/api/redirect-set-cookie?scenario=redirect-include-response`,
{ credentials: 'include' },
);
assert((await redirectedInclude.json()).cookieHeader ===
'redirect_include_response=should_persist');
assert((await readCookies('include')).cookieHeader ===
'redirect_include_response=should_persist');
Results
All 10/10 checks passed independently on each platform.
| Behavior | Expected include control |
Expected omit behavior |
iOS | Android |
|---|---|---|---|---|
| Existing cookies, direct request | sent | not sent | PASS | PASS |
Existing cookies, followed 302 |
sent | not sent | PASS | PASS |
Direct response Set-Cookie |
persisted | ignored | PASS | PASS |
302 response Set-Cookie on redirected request |
sent | not sent | PASS | PASS |
302 response Set-Cookie after the request |
persisted | ignored | PASS | PASS |
Implementation context
The current request path also appears to implement this behavior explicitly:
whatwg-fetchmapscredentials: 'omit'toxhr.withCredentials = false:
https://github.com/JakeChampion/fetch/blob/v3.6.20/fetch.js#L587-L591- Android replaces the request client's cookie jar with
CookieJar.NO_COOKIESwhenwithCredentialsis false:
https://github.com/facebook/react-native/blob/v0.86.0/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.kt#L367-L373 - iOS sets
HTTPShouldHandleCookiesfromwithCredentials:
https://github.com/facebook/react-native/blob/v0.86.0/packages/react-native/Libraries/Network/RCTNetworking.mm#L316-L324
The native withCredentials wiring landed in 2017 (iOS, Android); the current Known Issues text was added later in react-native-website#769 in 2019. This history alone does not establish which edge cases were broken in 2019, but the unconditional wording does not match the current tested behavior.
Related older reports describe omit failing rather than the documentation being stale: #12956 and #30885. Neither documents a current remaining failure mode.
Request
Please remove credentials: 'omit' from the list of unsupported options in the current / 0.86 Networking docs. If a specific remaining edge case is known, please narrow the warning to that platform, version, or scenario and link the corresponding report.
- Ngôn ngữ chính
- C++
- Star
- 127k
- Fork
- 25.3k
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của react/react-native
-
Needs: Author Feedback Needs: Repro
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
react/react-native#58621 · 1 bình luận ·
-
Needs: Author Feedback Needs: Repro
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
react/react-native#58610 · 1 bình luận ·
-
Needs: Triage :mag:
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
react/react-native#58565 · 1 bình luận · 2 reaction ·
-
Needs: Author Feedback Needs: Repro
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
react/react-native#58555 · 4 bình luận · 1 reaction ·
-
Needs: Attention Needs: Repro
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
react/react-native#58526 · 2 bình luận ·
Tất cả issue của react/react-native
Issue tương tự
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
AXERA-TECH/ax-llm#77 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
games-on-whales/wolf#509 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
-
bug-unconfirmed
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
NVIDIA/cuda-samples#453 ·