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 для выполнения следующих действий:
- Получить параметры входа в систему из IBM WebSeal (например, тип страницы входа, URL-адрес отправки формы входа)
- Обмен ключами шифрования (помимо HTTPS, банк требует дополнительно шифровать трафик с помощью jCryption)
- Отправить зашифрованный логин/пароль
Все вышеперечисленные шаги были реализованы с помощью функции 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 сбрасывается после каждого вызова вышеуказанного кода, поэтому он все равно не работает.