Функции с идентификационни данни
Много хора са запознати с такъв флаг XmlHttpRequest като withCredentials, те знаят за какво служи, какви заглавки трябва да се използват заедно с него, така че браузърът да обработва отговорите на сървъра нормално. И аз също изглеждаше, че знаех, но това, което не знаех, потърсих в Google и всичко работи както трябва. Но един ден се натъкнах на неочаквано поведение, за което искам да ви разкажа. Както е посочено в спецификацията на www.w3.org/TR/cors/#omit-credentials-flag, withCredentials ни позволява да използваме потребителски идентификационни данни в заявка към сървъра, т.е. бисквитки, данни за удостоверяване и SSL клиентски сертификати.
Правя заявка за получаване на бисквитка:
Сървърът връща валиден отговор с:
Тук се случва неочакваното за мен: въпреки че посочих „withCredentials: true“, бисквитката, получена от първата заявка, не се изпраща във втората заявка.
Оказва се, че бисквитката от първата заявка не се съхранява от браузъра и няма какво да изпрати с втората заявка. Предположих, че причината е HttpOnly, но не беше възможно да проверя с бисквитката без този флаг, защото преди това се опитах да добавя "withCredentials: true" в първата заявка и се случи чудо - бисквитката се запазва от браузъра, а при втората заявка се изпраща успешно.
По този начин се оказва, че указването на "withCredentials: true" е необходимо не само за изпращане на "user-credentials" взаявкатакъм сървъра, но и за да ги използваме от отговорите от сървъра. Изглежда логично, но използването на думата „заявка“ във всички спецификации и описания е объркващо, надявам се не само мен)
PS. Някак си пропуснах тази спецификация, където директно пише, че при липса на този атрибут "бисквитките трябва да бъдат игнорирани в отговор", двойка за уменията ми за търсене. Но се надявам, че сега мнозина ще могат да избегнат евентуално недоразумение.
И тук можемполучавате грант за пробен период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".