Проблемы использования ODataModel в условиях CORS
Для начала давайте разберёмся, что такое CORS? CORS расшифровывается как Cross-Origin Resource Sharing. Это механизм браузера, который позволяет определить список ресурсов, к которым страница может получить доступ.
Он нужен для обеспечения безопасности и защиты пользователей от злоумышленников при использовании HTTP-протокола.
По умолчанию сайты могут запрашивать ресурсы только со своего origin. Такое ограничение называется Same-Origin Policy. CORS расширяет Same-Origin Policy, позволяя получать доступ к ресурсам с разных доменов.
origin – это комбинация протокола, домена и порта (если он указан). Например, edu.sapland.ru – это домен, а https://edu.sapland.ru – origin.
При разработке проекта перехода заказчика на back-end отличный от SAP встал вопрос управления различными источниками данных, так как предполагалось, что SAP UI5 приложение будет иметь возможность получать данные из классических SAP систем и из систем, написанных на Java. Перед командой встал выбор: решить эту проблему организацией прокси, чтобы все источники размещались на одном хосте, или научить oDataModel работать с CORS. И так как второй вариант значительно упрощал организацию работ на старте проекта, был выбран именно он.
Разработка начиналась, когда последняя актуальная версия библиотеки SAP UI5 была 1.120.0, и при первоначальном рассмотрении показалось, что sap.ui.model.odata.v2.ODataModel и sap.ui.model.odata.v4.ODataModel умеют работать с CORS, так как в документации указан параметр withCredentials, но при реализации решения стало понятно, что SAP подошёл к добавлению данной функции поверхностно.
Так, при запуске приложения оказалось, что флаг withCredentials добавлен в методе sendRequest компонента sap.ui.model.odata.v4.lib._Requestor.js, но его не было в методах setSessionContext refreshSecurityToken, из-за чего фактически работало только получение metadata, а все остальные запросы валились с ошибками. После чего было выполнено расширение ODataModel v4 для исправления данных проблем.
Ниже приведён пример кода расширения ODataModel v4:
К счастью, почти через полгода старта нашего проекта, SAP наконец исправил данную ошибку, и если вы используете последнюю версию библиотеки или версию 1.120, начиная с подверсии 22, то вы с данной проблемой не столкнётесь.
Но, к сожалению, SAP не добавил поддержку свойства withCredentials в sap.m.upload.UploadSet и в sap.ui.export.Spreadsheet, из-за чего не работает загрузка файлов и формирование Excel на основе данных из OData при работе с CORS. Как обойти данные проблемы, вы узнаете на мастер-классе “Адаптация ODataModel к работе в условиях CORS” 27 ноября. Приглашаем!
Об авторе:
Сергей Галяндин,
эксперт UI5-разработчик.
Опыт в качестве Full-Stack разработчика UI5-приложений с 2018 года. На проектах выступает в роли UI5-разработчика, также имеет опыт разработки ABAP. Имеет уникальный опыт расширения и доработки UI5-приложений в модуле SAP Audit Management.