Приложение Android не возвращает файлы cookie сеанса в MFP 7.1

1) Тип приложения: Mobile Banking
2) Существующая версия Worklight: 6.1 (Consumer Edition)
3) Версия Cordova: 3.1.0
4) Поддерживаемая платформа: Android 4.2+, iOS 7+
5) Серверная ОС: Window Server 2008
6) Сервер приложений: IBM WebSphere Liberty Profile
7) База данных: IBM DB2

Приложения были реализованы с обработчиком Custom Challenge для аутентификации пользователя из IBM WebSeal. ChallengeHandler запускает HTTPS-запросы к IBM WebSeal для выполнения следующих действий:

  1. Получить параметры входа в систему из IBM WebSeal (например, тип страницы входа, URL-адрес отправки формы входа)
  2. Обмен ключами шифрования (помимо HTTPS, банк требует дополнительно шифровать трафик с помощью jCryption)
  3. Отправить зашифрованный логин/пароль

Все вышеперечисленные шаги были реализованы с помощью функции jQuery ajax(), post() или getJson(), она отлично работает в приведенной выше настройке.

Проблемы
После обновления Worklight 6.1 до MobileFirst 7.1 указанный выше метод аутентификации больше не работает на устройствах Android, с другой стороны, iOS по-прежнему работает должным образом.

Потратив несколько дней на устранение неполадок с подробными журналами запросов и ответов, мы пришли к выводу, что Android имеет другой контекст управления файлами cookie между ajax() post() jQuery и HTTP-запросами MobileFirst.

Пример:
При использовании WLJQ.ajax(… myUrl …) сгенерируйте ответ Set-Cookie, файл cookie будет автоматически добавлен ко всем последующим запросам ajax, если запрос находится в соответствующем домене.

Но заголовок ответа Set-Cookies из запроса ajax() не влияет на следующие функции HTTP-запроса MobileFirst: 1. ChallengeHandler.submitLoginForm
2. WL.Client.invokeProcedure
3. WL.Client.login

Наш ChallengeHandler аутентифицирует пользователя и запоминает пользователя, используя значение cookie, но, поскольку файлы cookie не будут использоваться совместно MobileFirst и jQuery, вызов WL.Client.InvokeProcedure будет заблокирован IBM WebSeal, поскольку запрос был идентифицирован как неаутентифицированный. Пользователь.

Мы также заметили, что пользовательский агент для jQuery ajax/post сильно отличается от указанных выше функций MobileFirst:

MobileFirst User-Agent: Dalvik/2.1.0 (Linux; U; Android 6.0.1; SM-G925F Build/MMB29K)/Worklight/7.1.0.0 WLNativeAPI(zerolte; MMB29K.G925FXXU3DPCN; SM-G925F; SDK 23; Android 6.0 .1)

jQuery (работает на Samsung Galaxy S6)
User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; SM-G925F Build/MMB29K; wv) AppleWebKit/537.36 (KHTML, как Gecko) Version/4.0 Chrome/49.0 .2623.105 Мобильный Safari/537.36/Worklight/7.1.0.0

Сводка по устранению неполадок
1) Обновите CookieManager Android, чтобы он принимал сторонние файлы cookie.

CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptThirdPartyCookies(webView, true);

2) Вручную получить значения cookie из jQuery post() и добавить в функцию MobileFirst, используя WL.Client.setCookie

Но из-за ограничений браузера мы не смогли получить значение заголовков Set-Cookie.

3) Преобразование всех вызовов jQuery для использования callHandler.submitLoginForm, но при таком подходе сеанс MobileFirst сбрасывается после каждого вызова вышеуказанного кода, поэтому он все равно не работает.


person user3099407    schedule 13.04.2016    source источник


Ответы (2)


После открытия PMR с IBM это действительно изменение дизайна, начиная с WL 6.2. Согласно IBM ниже:

• В операционной системе iOS хранилище файлов cookie управляется отдельным объектом (общим экземпляром). В результате файлы cookie приложения используются совместно запросами AJAX из веб-просмотра и собственными запросами. По этой причине приложение iOS, перенесенное с версии 6.1 на версию 6.1, кажется, продолжает работать без изменения кода.

• В операционной системе Android это не так. Хранилище файлов cookie зависит от каждого http-клиента, поэтому AJAX и собственные запросы не используют файлы cookie. Изменение кода приложения требуется в случае, если приложение выдает пользовательские запросы AJAX.

Мы изменили наш код, чтобы использовать рекомендуемый IBM API WLResourceRequest.

person O.W.    schedule 09.08.2016
comment
Можете ли вы предоставить исходный код документации IBM - person srikanth Nutigattu; 25.05.2017

Будет лучше, если вы сформулируете свой текст как вопрос. Непонятно, действительно ли у вас есть вопрос.

Если вы это сделаете, то тема, представленная в вопросе, требует открытия IBM PMR (тикета в службу поддержки), поскольку это невозможно будет обработать с помощью вопроса на StackOverflow.

Если вы открываете PMR, предоставьте полное воспроизведение.

person Idan Adar    schedule 13.04.2016
comment
Да, мы открыли ПМР по этому поводу. - person user3099407; 13.04.2016