Не удается отправить учетные данные через CORS на IOS

#ionic-framework #tomcat #cors #httpclient #credentials

#ionic-framework #tomcat #cors #httpclient #учетные данные

Вопрос:

У меня проблема с полтергейстом, и я прихожу к вам после долгого решения этой проблемы.

У меня есть гибридное приложение с такими характеристиками:

 -Ionic 3.9.2
-Angular 5.2.11
-Cordova Android 8.1.0 and iOS 5.1.1
-Cordova 8.0.0
  

Мое приложение отправляет запрос на серверную часть SOAP, которая защищена защищенным файлом cookie JSESSIONID (сервер Tomcat).

Мне пришлось включить CORS, чтобы мои запросы могли доходить до серверной части, это фильтр Tomcat CORS:

 <filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>ionic://localhost,http://localhost</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,SOAPAction,Cache-Control</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
    <init-param>
        <param-name>cors.support.credentials</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>cors.preflight.maxage</param-name>
        <param-value>10</param-value>
    </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
  

Когда я выполняю вход в серверную часть, сервер УСТАНАВЛИВАЕТ файл cookie (JSESSION), который используется для отправки последующего запроса на серверную часть для аутентификации в защищенном WS.
Это код для выполнения запроса httpclient angular (то же самое для последующего запроса)

  this.http.post(wsurl, xml, {
        withCredentials: true,
        responseType: 'text',
        headers: headers,
        observe: 'response'
      })
        .toPromise()
        .then(response => {})
        .catch(err =>{})
  

Моя проблема в том, что серверная часть после включения CORS не проверяет подлинность моего последующего запроса на iOS / safari (Android, chrome работает нормально)

Но это полтергейст:

Та же сборка приложения, развернутая на Iphone 6 iOS версии 12.4.5, работает нормально.На iPhone X с iOS v 14 и симуляторами (любой версии) не работает.

Серверная часть возвращает эту ошибку:

 <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <soapenv:Fault>
            <faultcode>soapenv:Server.generalException</faultcode>
            <faultstring>User has not a valid M4Session</faultstring>
            <detail>
                <ns1:exceptionName xmlns:ns1="http://xml.apache.org/axis/">com.meta4.soapservices.exception.M4SoapException</ns1:exceptionName>
                <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">cd102015</ns2:hostname>
            </detail>
        </soapenv:Fault>
    </soapenv:Body>
</soapenv:Envelope>
  

Как я могу это исправить?

Комментарии:

1. У меня такая же проблема с iOS14, работает с iOS13. Похоже, они что-то изменили здесь. Я надеюсь, что у кого-то есть информация об этом.

2. Для меня это очень странно. Такая же сборка не работает на ios 14 и ios 13.7, но она работает на ios 12.5..

3. У меня аналогичная проблема с Cordova, Signalr, CORS и iOS 14, но только в режиме выпуска. Это работает на iOS 13 … не могли бы вы что-нибудь выяснить? На самом деле создание нашего приложения cordova работает, но не тогда, когда оно интегрировано в Webview в собственном приложении