Ответ 1
Эта ошибка была отправлена и отправлена в трекер Chromium Bug. По словам разработчиков Chromium, мы ничего не можем сделать со стороны приложения.
С момента выхода Chrome 63 на Android, 6 декабря 2017 года, я столкнулся с проблемой, связанной с приложениями на базе Android от компании Cordova. Это приложение включает в себя IFrames, которые позволяют пользователям перемещаться по частям сайта электронной коммерции моих компаний из приложения.
Навигация между страницами, загруженными в IFrames , больше не отправляет информацию cookie в заголовки запроса.
Информация, такая как идентификаторы сеансов, которые хранятся в файле cookie, не передается на следующую страницу, что, в свою очередь, заставляет следующую страницу запускать совершенно новый сеанс пользователя!
Странно, однако, что любые вызовы AJAX, предварительно сформированные на странице в IFrames (например, для извлечения количества элементов в корзине) и запросов на ресурсы (css js, файлы изображений и т.д.), отправляют информацию cookie в заголовки запроса хорошо. Идентификатор сеанса в этих заголовках идентичен между страницами, что указывает на постоянство сеанса.
Файлы cookie создаются нормально, и я могу видеть их при использовании инструментов разработчика Chrome на панели приложений в домене компаний. Они просто не передаются на следующую страницу.
Я испытал эту проблему на устройстве Android 7.1.1. Когда я отключу приложение Chrome на этом устройстве, заголовки запросов файлов cookie в IFrames в приложении снова начнут работать нормально, возможно, веб-просмотр Кордовы больше не использует Chrome, когда он отключен?
Кто-нибудь знает, что может вызвать эту проблему? Может ли это быть связанным с кукисами SameSite или строгими изменениями изоляции сайта или другими изменениями, связанными с безопасностью в Chrome 63?
Проблема похожа на эту ошибку Chromium, которая была исправлена в октябре 2016 года: https://bugs.chromium.org/p/chromium/issues/detail?id=634311
Однако в Webview есть файлы cookie сторонних разработчиков в классе SystemCookieManager библиотеки Cordova (Cordova Android 6.4.0):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.setAcceptThirdPartyCookies(webView, true);
}
Извините, если я не указал ничего достаточно ясно. Я рад предоставить дополнительную информацию, если кто-то может помочь с этой проблемой.
Эта ошибка была отправлена и отправлена в трекер Chromium Bug. По словам разработчиков Chromium, мы ничего не можем сделать со стороны приложения.
Вот способ воспроизвести проблему без Кордовы. Он использует http://httpbin.org/cookies/set?k2=v2&k1=v1 для проверки файлов cookie. С Android System WebView против 63 cookies не отправляются. С предыдущими версиями они отправляются. Надеюсь, это поможет найти ответ на вопрос. Вот ссылка на полный проект Android: https://www.dropbox.com/s/s53wfy71uou11rh/test-webview.zip?dl=0
MainActivity.java
package com.example.mihai.twv;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.CookieManager;
import android.webkit.WebView;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWebView();
loadWebView();
}
private void initWebView() {
mWebView = (WebView) findViewById(R.id.webView);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
}
}
private void loadWebView() {
String url = "http://httpbin.org";
String html = getLocalFileContents("html/main.html");
mWebView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null);
}
private String getLocalFileContents(String filepath) {
String response = "";
try {
InputStream is = getAssets().open(filepath);
int size = is.available();
StringBuilder builder = new StringBuilder();
byte[] buffer = new byte[size];
while (is.read(buffer) != -1) {
builder.append(new String(buffer, "UTF-8"));
}
is.close();
response = builder.toString();
} catch (Exception e) {
}
return response;
}
}
html/main.html(в папке с ресурсами)
<html>
<head>
<base href="file:///android_asset/html/">
<link type="text/css" rel="stylesheet" href="../css/main.css" />
</head>
<body>
<iframe src="http://httpbin.org/cookies/set?k1=v1&k2=v2" frameborder="0"></iframe>
</body>
css/main.css(в папке с ресурсами)
html,
body,
iframe {
width: 100%;
height: 100%;
}
Это была ошибка в Chrome, она исправлена. Я обновил Chrome снова, и теперь он отлично работает на моем устройстве.
Что мы можем извлечь из этого, так это то, что Кордова зависит от других приложений...
Если ваш IFrame просматривает URL-адрес https, Chrome 63 генерирует предупреждение о безопасности, связанное с сертификатом SSL, созданным Symantec. В приложении "Кордова" не допускается больше навигации по IFrame.
См. ниже для получения дополнительной информации: https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html