Expo ಆ್ಯಪ್ Android 9 ನಲ್ಲಿ HTTP ನಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ: ಕಾರಣ cleartext, VPN ಅಲ್ಲ
ಸಾಮಾನ್ಯ HTTP API ಅನ್ನು ಕರೆಯುವ Expo ಬಿಲ್ಡ್ Android 9 ಮತ್ತು ನಂತರದಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ. ಟನೆಲ್ ನಿರ್ದೋಷಿ: cleartext ಫ್ಲ್ಯಾಗ್ ಬಿಲ್ಡ್ ಕಾನ್ಫಿಗ್ನಲ್ಲಿರಬೇಕು.
ನೀವು ಹೊಸ ಬಿಲ್ಡ್ ಬಿಡುಗಡೆ ಮಾಡಿದಿರಿ, VPN ಗೆ ಹೋದಿರಿ, ಮತ್ತು ಅದೇ ಸ್ಕ್ರೀನ್ ಲೋಡ್ ಆಗುವುದನ್ನು ನಿಲ್ಲಿಸಿತು. Android 9 ಮತ್ತು ನಂತರದಲ್ಲಿ ಹೆಚ್ಚು ಸಾಮಾನ್ಯ ವಿವರಣೆ ಹೆಚ್ಚು ನೀರಸವಾಗಿದೆ: API 28 ಅಥವಾ ಹೆಚ್ಚಿನದನ್ನು ಗುರಿಯಾಗಿಸುವ ಆ್ಯಪ್ಗಳಿಗೆ ಪ್ಲಾಟ್ಫಾರ್ಮ್ ಸಾಮಾನ್ಯ HTTP ಅನ್ನು ನಿರಾಕರಿಸುತ್ತದೆ, ಮತ್ತು VPN ಅದನ್ನು ಬಯಲು ಮಾಡಲು ಸಾಕಷ್ಟು ಸಂದರ್ಭವನ್ನು ಮಾತ್ರ ಬದಲಿಸಿತು. ನೀವು ನೋಡುವ ದೋಷ HTTP ಕ್ಲೈಂಟ್ ಅನ್ನು ಅವಲಂಬಿಸಿದೆ, ಆದ್ದರಿಂದ ಅದು cleartext ಎಂದು ಅತಿ ವಿರಳವಾಗಿ ಹೇಳುತ್ತದೆ.
ಈ ವೈಫಲ್ಯ ವಾಸ್ತವವಾಗಿ ಏನು
Android 9 ರಿಂದ ಪ್ಲಾಟ್ಫಾರ್ಮ್ ಡಿಫಾಲ್ಟ್ ಆಗಿ cleartext ಅನ್ನು ಬ್ಲಾಕ್ ಮಾಡುತ್ತದೆ, ಆ್ಯಪ್ API ಮಟ್ಟ 28 ಅಥವಾ ಹೆಚ್ಚಿನದನ್ನು ಗುರಿಯಾಗಿಸಿದ ಕ್ಷಣ. ಸಾಮಾನ್ಯ HTTP ವಿಳಾಸಕ್ಕೆ ಇರುವ ವಿನಂತಿಯನ್ನು ಸಾಧನದಿಂದ ಒಂದು ಪ್ಯಾಕೆಟ್ ಕೂಡ ಹೊರಬರುವ ಮೊದಲೇ ಪ್ಲಾಟ್ಫಾರ್ಮ್ ನಿರಾಕರಿಸುತ್ತದೆ. ಯಾವ ದೋಷ ಕಾಣುತ್ತದೆ ಎಂಬುದು HTTP ಲೈಬ್ರರಿಯನ್ನು ಅವಲಂಬಿಸಿದೆ: ಕೆಲವೊಮ್ಮೆ ಸಾಮಾನ್ಯ ನೆಟ್ವರ್ಕ್ ವೈಫಲ್ಯ, ಕೆಲವೊಮ್ಮೆ ಸಮಯ ಮೀರುವಿಕೆ, ಕೆಲವೊಮ್ಮೆ cleartext ಅನ್ನು ನೇರವಾಗಿ ಹೆಸರಿಸುವ ಸಂದೇಶ. ಅದು ಎಂದೂ ಮಾಡದ್ದು ನಿಮ್ಮ ಸರ್ವರ್ ತಲುಪುವುದು. Android ಡಿಫಾಲ್ಟ್ ಮತ್ತು ಡೊಮೇನ್-ಸೀಮಿತ ಪರ್ಯಾಯವನ್ನು ತನ್ನ ಭದ್ರತಾ ಸಂರಚನಾ ಮಾರ್ಗದರ್ಶಿಯಲ್ಲಿ ದಾಖಲಿಸಿದೆ.
ಅದೇ ಸಾಧನದ ಬ್ರೌಸರ್ ಇನ್ನೂ ಪುಟವನ್ನು ಲೋಡ್ ಮಾಡಬಲ್ಲದು, ಮತ್ತು ಬಹುತೇಕ ಜನರು ಕಳೆದುಕೊಳ್ಳುವ ಸುಳಿವು ಅದೇ. ಬ್ರೌಸರ್ಗಳು ನಿಮ್ಮ ಆ್ಯಪ್ನ ನೆಟ್ವರ್ಕ್ ಭದ್ರತಾ ನೀತಿಗೆ ಒಳಪಡುವುದಿಲ್ಲ.
VPN ಗೆ ದೂರು ಏಕೆ
ಸಾಮಾನ್ಯವಾಗಿ ಮೂರು ವಿಷಯಗಳು ಒಟ್ಟಿಗೆ ಬದಲಾಗುತ್ತವೆ. VPN ಸಂಪರ್ಕಗೊಂಡ ನಂತರ ಆ್ಯಪ್ ಬೇರೆ ಹೋಸ್ಟ್ನಾಮ್ ಅನ್ನು ಪರಿಹರಿಸಬಹುದು, ಸಾಧನ ಹೊಸದಾಗಿರಬಹುದು ಮತ್ತು ಹೊಸ ಬಿಲ್ಡ್ ಹೊಂದಿರಬಹುದು, ಅಥವಾ ಬಿಲ್ಡ್ ಸ್ವತಃ ಡಿಫಾಲ್ಟ್ ಅನ್ನು ಪ್ರಚೋದಿಸುವ ಗುರಿ API ಮಟ್ಟಕ್ಕೆ ಹೋಗಿರಬಹುದು. VPN ಕಾಣುತ್ತದೆ ಮತ್ತು ಗುರಿ SDK ಕಾಣುವುದಿಲ್ಲ, ಆದ್ದರಿಂದ ಟಿಕೆಟ್ VPN ಗೆ ಸಿಗುತ್ತದೆ.
ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗ್ ಮುಟ್ಟುವ ಮೊದಲು ಹಳೆಯ ಮತ್ತು ಹೊಸ ಬಿಲ್ಡ್ಗಳ ಗುರಿ ಮಟ್ಟಗಳನ್ನು ಹೋಲಿಸಿ. 27 ಅಥವಾ ಕಡಿಮೆ ಗುರಿಯಾಗಿಸುವ ಆ್ಯಪ್ ವಿನಾಯಿತಿ ಪಡೆದಿದೆ, ಮತ್ತು ಇದು «ನನ್ನ ಹಳೆಯ ಫೋನ್ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ» ಎಂಬ ಪ್ರತಿಯೊಂದು ವರದಿಯನ್ನು ವಿವರಿಸುತ್ತದೆ.
Expo ಫ್ಲ್ಯಾಗ್ ವಾಸ್ತವವಾಗಿ ಎಲ್ಲಿ ಬೀಳುತ್ತದೆ
ನಿರ್ವಹಿತ Expo ಪ್ರಾಜೆಕ್ಟ್ನಲ್ಲಿ app.json ಗೆ ಸೆಟ್ಟಿಂಗ್ ಸೇರಿಸುವುದು Android ಮ್ಯಾನಿಫೆಸ್ಟ್ ಅನ್ನು ಸಂಪಾದಿಸುವುದಿಲ್ಲ, ಏಕೆಂದರೆ ಮ್ಯಾನಿಫೆಸ್ಟ್ ಅನ್ನು prebuild ಮತ್ತು ಡೆವಲಪ್ಮೆಂಟ್ ಬಿಲ್ಡ್ಗಳು ಉತ್ಪಾದಿಸುತ್ತವೆ. ಆ ಹಂತದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ ಬರೆಯುವುದು ಕಾನ್ಫಿಗ್ ಪ್ಲಗಿನ್. ಬೆಂಬಲಿತ ಮಾರ್ಗ expo-build-properties, ಇದನ್ನು ಆ್ಯಪ್ ಕಾನ್ಫಿಗ್ನಲ್ಲಿ android ಅಡಿಯಲ್ಲಿ cleartext ಆಯ್ಕೆಯೊಂದಿಗೆ ಸಂರಚಿಸಲಾಗುತ್ತದೆ.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}ಸ್ನಿಪೆಟ್ ಪ್ಲಗಿನ್ ಆಯ್ಕೆಯನ್ನು ಮಾತ್ರ ಹೊಂದಿಸುತ್ತದೆ; ಮ್ಯಾನಿಫೆಸ್ಟ್ ನಂತರ ಉತ್ಪಾದನೆಯಾಗುತ್ತದೆ. prebuild ಅಥವಾ ಹೊಸ ಡೆವಲಪ್ಮೆಂಟ್-ಕ್ಲೈಂಟ್ ಬಿಲ್ಡ್ ಚಲಾಯಿಸಿ, ನಂತರ ಮತ್ತೆ ಪರೀಕ್ಷಿಸುವ ಮೊದಲು ಉತ್ಪಾದಿಸಿದ AndroidManifest.xml ನಲ್ಲಿ android:usesCleartextTraffic ಇದೆಯೇ ಪರಿಶೀಲಿಸಿ, ಏಕೆಂದರೆ JS ಮಾತ್ರ ಮರುಲೋಡ್ ಮಾಡಿದರೆ ಹಳೆಯ ಮ್ಯಾನಿಫೆಸ್ಟ್ ಉಳಿಯುತ್ತದೆ. ಪ್ಲಗಿನ್ ಆವೃತ್ತಿಯನ್ನು ಪ್ರಾಜೆಕ್ಟ್ ಚಲಿಸುವ Expo SDK ಗೆ ಹೊಂದಿಸಿ. ಪ್ಲಗಿನ್ ಆಯ್ಕೆಗಳು ಬಿಡುಗಡೆಗಳ ನಡುವೆ ಸರಿಯುತ್ತವೆ, ಮತ್ತು ಬೇರೆ SDK ನಿಂದ ನಕಲಿಸಿದ ಸ್ನಿಪೆಟ್ ಮೌನ ನಿಷ್ಕ್ರಿಯತೆಯ ವಿಶ್ವಾಸಾರ್ಹ ಮೂಲ.
Bare ವರ್ಕ್ಫ್ಲೋ ಮತ್ತು ಸಣ್ಣ ಆಯ್ಕೆ
bare React Native ಗೆ ಸಮಾನವಾದದ್ದು application ಎಲಿಮೆಂಟ್ನಲ್ಲಿ android:usesCleartextTraffic, ಅಥವಾ ಹೆಸರಿಸಿದ ಡೊಮೇನ್ಗಳಿಗೆ ಮಾತ್ರ cleartext ಅನ್ನು ಅನುಮತಿಸುವ ನೆಟ್ವರ್ಕ್ ಭದ್ರತಾ ಸಂರಚನೆ. ಡೊಮೇನ್-ಸೀಮಿತ ರೂಪವೇ ಆಯ್ಕೆ ಮಾಡಬೇಕಾದದ್ದು, ಏಕೆಂದರೆ ಅದು ಒಳಗಿನ API ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ ಮತ್ತು ಉಳಿದೆಲ್ಲವನ್ನು HTTPS ನಲ್ಲಿಯೇ ಬಿಡುತ್ತದೆ. ಅದು ತನ್ನದೇ ಆದ ವಿನಾಯಿತಿ ಪಟ್ಟಿಯನ್ನೂ ದಾಖಲಿಸುತ್ತದೆ, ಮತ್ತು ವಿಮರ್ಶಕರು ಕೇಳುವುದು ಅದೇ ಭಾಗವನ್ನು.
ಎರಡೂ ವಿಧಾನಗಳಲ್ಲಿ ಯಾವುದೂ ನೀವು ಹೆಸರಿಸದ ಯಾವುದಕ್ಕೂ ಪ್ಲಾಟ್ಫಾರ್ಮ್ನ ಡಿಫಾಲ್ಟ್ ಅನ್ನು ಬದಲಿಸುವುದಿಲ್ಲ.
ಮೊದಲು ಸಾಧನದ ಲಾಗ್ನಿಂದ ಸಾಬೀತುಪಡಿಸಿ
ಕಾನ್ಫಿಗ್ ಸಂಪಾದಿಸುವ ಮೊದಲು ನಿಖರವಾದ ವೈಫಲ್ಯವನ್ನು ಪಡೆಯಿರಿ. ಸಂಪರ್ಕಿತ ಸಾಧನದಲ್ಲಿ adb logcat ಪ್ಲಾಟ್ಫಾರ್ಮ್ನ cleartext ನಿರಾಕರಣೆಯನ್ನು ತೋರಿಸುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಎತ್ತಿದ ಘಟಕವನ್ನು ಹೆಸರಿಸುತ್ತದೆ. ನಿರಾಕರಿಸಿದ ಸಾಕೆಟ್, ಪರಿಹರಿಸಲಾಗದ ಹೆಸರು ಅಥವಾ ವಿಫಲವಾದ TLS ಹ್ಯಾಂಡ್ಶೇಕ್ ಸಂಪೂರ್ಣ ಬೇರೆಡೆಗೆ ತೋರಿಸುತ್ತವೆ, ಮತ್ತು cleartext ಸಕ್ರಿಯಗೊಳಿಸುವುದು ಆ್ಯಪ್ ಅನ್ನು ವ್ಯರ್ಥವಾಗಿ ದುರ್ಬಲಗೊಳಿಸುತ್ತದೆ ಅಷ್ಟೇ.
ನಂತರ ಉತ್ಪಾದನೆಯನ್ನು ಪ್ರಾಮಾಣಿಕವಾಗಿ ಇರಿಸಿ. TLS ನೀಡಲಾಗದ ಲ್ಯಾಬ್ ಎಂಡ್ಪಾಯಿಂಟ್ಗೆ cleartext ಸ್ವೀಕಾರಾರ್ಹ, ಮತ್ತು ನೀವು ಯೋಜಿಸಬಹುದಾದ ಅತಿ ಕಡಿಮೆ ಸಮಯಕ್ಕೆ ಮಾತ್ರ. API ಖಾಸಗಿ ನೆಟ್ವರ್ಕ್ ಒಳಗೆ TLS ಅನ್ನು ಕೊನೆಗೊಳಿಸಬಲ್ಲದಾದರೆ, ಪ್ರಮಾಣಪತ್ರವನ್ನು ಸಾಧನದ ಟ್ರಸ್ಟ್ ಸ್ಟೋರ್ನಲ್ಲಿ ಇರಿಸಿ ಮತ್ತು cleartext ನಿಷ್ಕ್ರಿಯವಾಗಿ ಬಿಡಿ, ಏಕೆಂದರೆ ಟನೆಲ್ ತನ್ನ ನಿರ್ಗಮನದವರೆಗಿನ ಮಾರ್ಗವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡುತ್ತದೆ, ಅದರಾಚೆಗೆ ಏನನ್ನೂ ಅಲ್ಲ.
ಎಂಡ್ಪಾಯಿಂಟ್ HTTPS ನಲ್ಲಿ ಉತ್ತರಿಸಲು ಪ್ರಾರಂಭಿಸಿದಾಗ, ಅನುಮತಿಯನ್ನು ತೆಗೆದುಹಾಕಿ, ಮತ್ತೆ ಬಿಲ್ಡ್ ಮಾಡಿ ಮತ್ತು ಅದೇ ಅವಧಿಯಲ್ಲಿ VPN ನಲ್ಲಿ ಮತ್ತು ಸಾಮಾನ್ಯ Wi-Fi ನಲ್ಲಿ ಪರೀಕ್ಷಿಸಿ. ಹೆಸರು ಪರಿಹಾರವು ಈ ಎರಡು ಮಾರ್ಗಗಳಲ್ಲಿ ಭಿನ್ನವಾಗಿರಬಹುದು, ಮತ್ತು ಯಾವುದು ಸತ್ಯ ಹೇಳುತ್ತಿದೆ ಎಂಬುದನ್ನು ಆ ಜೋಡಿ ಮಾತ್ರ ಹೇಳುತ್ತದೆ.