У меня есть узел / express.js RESTApi, который обрабатывает вызовы от клиента AJAX (1 html и 1 js файл).Клиент должен позволить пользователю видеть все записи / записи по идентификатору в базе данных sqlite3, в которой хранятся книги и авторы.При входе в систему пользователь также должен иметь возможность создавать, обновлять и удалять записи.Клиент AJAX есть как в обычной веб-версии, так и в версии для Android.Для Android клиент AJAX загружается в WebView.
Установка:
Веб-клиент AJAX запускается на веб-сервере в контейнере док-станции и доступен по адресу http://localhost:8080'. API-интерфейс node / express.js работает в другом контейнере, и связь между этими двумя контейнерами осуществляется через стандартную сеть Docker Bridge.Для клиента webversion все вызовы API выполняются без проблем.Для Android, AJAX-клиент html и js-файл хранится локально и включается в APK-файл.Клиентский HTML-файл загружается следующим образом:
webView.settings.javaScriptEnabled = true
webView.settings.allowFileAccessFromFileURLs = true
webView.settings.allowUniversalAccessFromFileURLs = true
webView.loadUrl("file:///android_asset/crud.html")
Оба js-файла (для веб-версии и версии для Android) одинаковы, за исключением того, что URL-адреса для всех HTTP-запросов настраиваются для каждого случая.Android-устройство подключено к той же сети, что и компьютер, на котором запущен REST-контейнер, и все запросы принимаются, но не обрабатываются должным образом, поскольку источник «File: //» не разрешен.
Всезапрос выполняется через XMLHttp, и withCredentials = true
для всех операций, требующих входа пользователя в систему. GET-запросы выполняются без учетных данных.
До сих пор я пробовал следующее:
1.Использование узла 'cors' модуль / настройка Allow-Origin на '*'
Конфигурация по умолчанию для cors:
{
"origin": "*",
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
"preflightContinue": false,
"optionsSuccessStatus": 204
}
При использовании модуля cors с вышеуказанной конфигурацией, яЯ могу делать только запросы GET.При проверке сетевой информации из Firefox также кажется, что отображаются только запросы OPTION (не имеет значения, является ли запрос GET, POST, PUT или DELETE).Когда источник задан явно, информация о сети показывает две строки на запрос, что является одним из 4-х запросов типа «вместе с запросом опции».Я включил два скриншота ниже:
POST-запрос для добавления книги (источник указан явно):
POST-запрос для добавления книги (источник установлен на'*'):
Когда для источника установлено значение подстановочного знака, файл cookie сеанса не включается в запросы и его невозможно сделатьPOST, PUT и DELETE запросы правильно.При входе в систему файл cookie сеанса также не включается в заголовок ответа.Когда источник задан явно, эти запросы работают нормально, и файл cookie сеанса включается в заголовок ответа при входе в систему. Этот тест был выполнен через клиент веб-версии, потому что я не знаю, как получить информацию о заголовке сети и запроса / ответа при выполнении этоготест с андроид устройства.Во всяком случае, я не могу делать запросы POST, PUT и DELETE с устройства Android, и я думаю, что это может быть по тем же причинам, по которым связь между версией веб-клиента и API не работает должным образом, когда Allow-Originустановите на «*».
2.Подмена источника на стороне сервера
var http = require ('http');
var opt = {host: 'ip: port', path: '/', headers: {origin: 'http://spoofedorigin.com'}};
http.get (opt);
При попытке войти в систему с устройства Android я распечатал заголовок запроса наконсоль из RESTApi, снимок экрана ниже:
Источник все еще показывал «File: //» в заголовке запроса и явно разрешал 'http://spoofedorigin.com' как источник не решил проблему.
3.Загрузка клиента AJAX с удаленного URL-адреса
Я попытался загрузить клиент AJAX, работающий в ранее упомянутом контейнере веб-сервера / докера, но вместо использования URL-адреса'http://localhost:8080', Я заменил' localhost * на IP (та же сеть, что и на устройстве Android) машины, на которой работает контейнер, порт по-прежнему 8080. Я могу загрузить клиента в веб-просмотр, нокажется, что файл js (также удаленный) не отвечает, когда я пытаюсь сделать любой запрос.Я попытался включить файл js в качестве отдельного файла, а также включил все функции js в теги сценария with.Загрузка клиента с удаленного сервера представляется наиболее подходящим вариантом для решения проблемы с источником, поскольку URL-адрес загрузки начинается с файла http://' вместо 'file: //*.
Finalвопрос / мысли:
Есть ли обходной путь для проблемы происхождения файла: //?Я бы предпочел включить html и js в файл APK.Если нет, то допустимо загружать клиента с удаленного URL-адреса, если этот удаленно загруженный клиент может правильно использовать файл js.Я знаю, что подобные сообщения были сделаны по этой теме, но ответы, как правило, «устанавливают« Разрешенные источники »на« * », но это не работает для резонаторов, описанных выше.