Файлы cookie в iframe внутри электронного приложения перестают работать при настройке пользовательского заголовка через webRequest.onBeforeSendHeaders - PullRequest
0 голосов
/ 31 октября 2019

У меня есть iframe в электронном приложении (v6.1.2), которое загружает внешний URL. Мне нужно загрузить этот URL с пользовательским заголовком, поэтому я использую webRequest.onBeforeSendHeaders(), чтобы перехватить запросы и вставить этот заголовок. Как только я передаю requestHeaders параметру обратного вызова, файлы cookie в iframe перестают работать.

в main.js:

import { remote } from 'electron'
// the constant MY_URL used below contains the extarnal URL
const webRequest = remote.getCurrentWindow().webContents.session.webRequest;
webRequest.onBeforeSendHeaders(
  {
    urls: [`${MY_URL}*`]
  },
  (details, callback) => {
    // I need to clone details.headers, as simply setting
    // details.headers['X-MY-CUSTOM-HEADER']
    // won't work
    let requestHeaders = Object.assign({}, details.headers);
    requestHeaders['X-MY-CUSTOM-HEADER'] = '1'
    // even if I set requestHeaders to details.headers, the issue persists.
    // only removing the requestHeaders property from the object below will make it work again:
    callback({ cancel: false, requestHeaders });
  },
  ['blocking', 'requestHeaders']  // doesn't make a difference,
  // and I didn't find anything cookie-related for the "extraInfoSpec" argument
);

PHPСкрипт по целевому URL:

<?php
session_start();
var_dump(session_id());
var_dump($_COOKIE);
exit;
?>

(псевдо-) вывод этого скрипта при каждом обновлении приложения или фрейма выглядит так:

string(26) "(random PHP session ID different on every call here)" array(0) { }

Если я удаляюсвойство requestHeaders из аргумента обратного вызова в main.js выше, вывод будет таким, как требуется: идентификатор сеанса PHP остается прежним, и все файлы cookie, которые устанавливает целевой сайт, сохраняются. Вот откуда я знаю, что это не проблема на стороне PHP. Я также могу исключить, что сам X-MY-CUSTOM-HEADER мешает, так как даже если вообще не менять заголовки (см. Комментарии к коду), проблема остается.

Я что-то упустил или это ошибка в электронном? Есть ли способ обойти это?

1 Ответ

0 голосов
/ 31 октября 2019

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

Объект details имеет свойство headers и свойство requestHeaders. Я на самом деле не уверен, в чем разница, поскольку, похоже, есть некоторые совпадения. Я правильно переписал requestHeaders, но я сделал это на базе requestHeaders. Так что все, что мне нужно было сделать, это поменять

let requestHeaders = Object.assign({}, details.headers);

на

let requestHeaders = Object.assign({}, details.requestHeaders);
...