В качестве сервера мы используем сервер Python Django, который мы работают как Docker-контейнер в Docker Compose. Мы используем прокси-сервер Nginx для обработки запросов http и https.
Файл конфигурации Nginx выглядит следующим образом:
Код: Выделить всё
upstream randomName.moreRandomName {
server moreRandomName:8000;
}
server {
listen 80;
listen [::]:80;
server_name localhost 0.0.0.0 127.0.0.1 ;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443;
server_name localhost 0.0.0.0 127.0.0.1 ;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
proxy_pass http://moreRandomName:8000/;
}
}
Ssl-сертификаты создаются с помощью локального сертификата. Авторизация с использованием mkcert.
Код: Выделить всё
mkcert --installКод: Выделить всё
mkcert localhost 127.0.0.1 0.0.0.0Код: Выделить всё
ByteData certs = await rootBundle.load('assets/certificates/fullchain.pem');
securityContext.setTrustedCertificatesBytes(certs.buffer.asUint8List());
Код: Выделить всё
// For Android
const String backendURL = "10.0.2.2";
// For IOS
//const String backendURL = "127.0.0.1";
final endpointPath = "/auth/";
final securityContext = SecurityContext.defaultContext;
ByteData certs = await rootBundle.load('assets/certificates/fullchain.pem');
securityContext.setTrustedCertificatesBytes(certs.buffer.asUint8List());
final client = HttpClient(context: securityContext);
request = await client.getUrl(
Uri.https(
backendURL,
endpointPath,
),
);
final response = await request.close();
if (response != null) {
if (response.statusCode == HttpStatus.ok) {
var responseBodyAsJson =
jsonDecode(await response.transform(utf8.decoder).join());
Код: Выделить всё
const String backendURL = "realbackendurl.com";Но использование нашего локального сервера разработки в Docker работает только с IOS Simulator. Для эмулятора Android с 10.0.2.2 в качестве внутреннего адреса мы получаем следующую ошибку:
HttpException: соединение закрыто до получения полного заголовка
Единственный ответ, который мы получаем в журналах от контейнера nginx, следующий:
рабочий процесс 24 завершился по сигналу 4Мы не можем просто использовать простой подход, используя import 'package:http/http.dart' как http;, потому что мы не можем получить доступ к контексту безопасности для сертификатов.
Если у вас есть вопросы, дайте мне знать. Любая помощь приветствуется!
Мы изменили все возможные внутренние адреса и проверили различные настройки, как описано выше.
Мы использовали разные устройства и эмуляторы. Как описано выше, ошибка остается для каждого эмулятора Android. Если у вас есть какие-либо предложения, дайте нам знать! Большое спасибо.
Изменить: мы используем уровень API 35. Мы уже пытались перейти на более низкие уровни API, такие как Pie или Q. Не сработало.
Подробнее здесь: https://stackoverflow.com/questions/786 ... connection
Мобильная версия