Почему я не могу видеть, что мой файл cookie (localhost) хранится в приложении Electron?

#cookies #electron

Вопрос:

У меня есть угловое приложение, использующее Electron в качестве оболочки рабочего стола. И есть отдельный сервер Django, который предоставляет HTTP-API для электронного клиента.

Поэтому обычно, когда я вызываю API входа в систему, в заголовке ответа будет Set-Cookie поле, содержащее sessionId . И я ясно вижу, что sessionId в Postman, однако, я не могу видеть этот файл cookie в своем приложении Angular (инструменты разработки Electron).

После некоторой дальнейшей отладки я заметил предупреждающий знак рядом с моими Set-Cookie инструментами разработки. В нем говорилось, что файл cookie заблокирован из-за SameSite установки значения Lax . Поэтому я нашел способ изменить код сервера, чтобы вернуть None samesite (вместе со Secure свойством; я использую HTTP):

 # settings.py
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'None'
 

что сработало (и предупреждающий знак исчез), но файл cookie по-прежнему не виден.

Так в чем же здесь проблема? Почему не могу (и как могу) Я вижу этот файл cookie, чтобы убедиться, что логин работает в реальном клиенте, а не только в почтальоне?

(кстати, сейчас разрабатываются оба конца localhost .)

Ответ №1:

Не о чем беспокоиться. Хороший способ проверить, работает ли это, — на самом деле сделать запрос, требующий входа в систему (после того, как API был протестирован почтальоном), и посмотреть, возвращаются ли нужные данные. Если это так, вы можете идти (особенно когда предупреждение исчезло).

Если файл sessionId cookie сохранен, он должен автоматически быть включен в запрос. Если только с путем печенья что-то не так; но / путь был бы в порядке.

Почему файл cookie не виден: вероятно, это связано с разделением переднего и заднего концов. В Electron страницы, как правило, представляют собой некоторые локальные HTML-файлы , так как одним из распространенных шагов во время настройки, вероятно, является изменение loadURL или что-то в main.js этом роде, например:

 mainWindow.loadURL(`file://${__dirname}/dist/your-project/index.html`);
 

Таким образом, «сайт», к которому вы обращаетесь с Electron, можно рассматривать как локальную файловую систему (у которой нет домена и, следовательно, вообще нет файлов cookie), и вы должны увидеть пустую file:// запись dev tools -> application -> storage -> cookie . Это не означает, что локальный путь содержит все файлы cookie приложения Electron. Хотя ваш сервер может находиться на том же локальном компьютере, вы получаете доступ к as http:// , а file:// не к тому, чтобы браузер (Electron) рассматривал его как настоящий веб-сервер.

Поэтому ваши файлы cookie должны храниться в другой записи, например http(s)://localhost , и вы не можете видеть ее в электронном виде. (Обратите внимание, что один и тот же файл cookie будет работать как в HTTP, так и в HTTPS)

Если вы вместо этого используете Chrome для тестирования, вы можете увидеть его во всех файлах cookie. В некоторых случаях, когда интерфейс и серверная часть развернуты на одном хосте, вы можете увидеть файл cookie в инструментах разработки. Но я думаю, что всегда есть какие-то причины, по которым вам нужен Electron для создания настольного приложения (например, скрипты Python).

Дальнейшее чтение

Использование HTTPS

Хотя переход на HTTPS не обязательно решает первоначальную проблему, возможно, это стоит сделать, чтобы предотвратить потенциальные проблемы и подготовиться к публикации.

В вашем случае для серверной части вы можете использовать django-sslserver в качестве временного решения перед получением SSL, но он использует самозаверяющий сертификат и может вызвать жалобы вашего интерфейса. Чтобы исправить это, подумайте о добавлении следующего кода в основной процесс:

 # const { app } = require('electron');

if (!app.isPackaged) {
  app.commandLine.appendSwitch('ignore-certificate-errors');
}
 

Теперь он обеспечивает хороший способ отличить разработку (распакованную) от производства (упакованную) и отключает проверку сертификатов только при разработке, чтобы код работал.

Ответ №2:

Предполагая, что SESSION_COOKIE_SECURE в вашей конфигурации ссылается на флаг безопасности cookie, вам нужно будет установить

 SESSION_COOKIE_SECURE = False 
 

потому что, если этот флаг установлен в значение True, браузер позволит установить этот файл cookie только в том случае, если вы используете https-соединение.

PS: Это только для вашего локального хоста. Надеюсь, вы будете использовать Https-соединение в других средах.

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

1. Да, вы правы. HTTPS-это правильный путь. Но я каким-то образом заставил его работать раньше при удаленном тестировании с почтальоном по протоколу HTTP с установленным флагом безопасности. Теперь он больше не работает, вероятно, из-за обновления программного обеспечения или чего-то еще. И я начал использовать HTTPS даже в localhost.