Локальное хранилище браузера отсутствует после перенаправления Patreon

У меня есть простая веб-страница, на которой используются клиентские скрипты для хранения нескольких пользовательских конфигураций в локальном хранилище браузера. (Статус флажков, раскрытых / свернутых меню и т. д.)

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

Когда пользователь, наконец, возвращается на мою домашнюю страницу, все данные в локальном хранилище пользователя отсутствуют. Если пользователь нажимает «Обновить» после возвращения на мой сайт, локальное хранилище все еще отсутствует. Однако, если они закроют вкладку и откроют мой сайт на новой вкладке (или перейдут на другой сайт, а затем вернутся обратно на той же вкладке), исходные значения локального хранилища снова будут видны.

Я понимаю, что локальное хранилище браузера связано с источником локального хранилища. https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

Я подтвердил, что и протокол (https), и домен идентичны для точки, в которой установлено хранилище, и точки, когда пользователь возвращается на мой сайт. Я также подтвердил, что окончательный маршрут приземления идентичен.

домашняя страница, на которой изначально установлены значения локального хранилища: https://www.example.com/page1 последняя целевая страница: https://www.example.com/page1

Я заметил, что если я остановлю пользователя на маршруте перенаправления Patreon (где Patreon изначально перенаправляет пользователей и где я записываю статус поддержки пользователей), открытие отладчика браузера и выдача document.domain дает: ""

Однако установка document.domain и обновления не восстанавливает локальное хранилище.

Я наблюдаю такое поведение как в Firefox 63.0.3 (64-бит), так и в Chrome 71.0.3578.80 (64-бит).

Есть идеи, что мне может не хватать?

[EDIT] Вот код, который я использую для записи состояния пользователя в локальное хранилище:

if (localStorage.userOptions){ restoreOptsFromLocal(); }
else{ persistOptsToLocal(); }
...
restoreOptsFromLocal = function(){
    opts = JSON.parse(localStorage.getItem('userOptions'));
}
persistOptsToLocal = function(){ 
    localStorage.setItem('userOptions', JSON.stringify(opts));
}

Моя первая мысль заключается в том, что ваше локальное хранилище не настроено для работы по http / https, но вы подтвердили, что пользователь начинается с https и заканчивается на https. Вы на 100% уверены, что протокол правильный? Редирект ничего не должен делать, но, возможно, ваш код очищает локальное хранилище при загрузке страницы? Можете ли вы поделиться той частью вашего кода, которую вы сохраняете в локальное хранилище?

AnonymousSB 09.12.2018 01:01

Конечно, добавлено как правка выше. Там немногое, чб. opts - это объект javascript с несколькими атрибутами. Кроме того, я подтвердил, что элемент локального хранилища существует до того, как пользователь уйдет на Patreon.

BitPusher16 09.12.2018 01:47

Вы проверяете наличие localStorage.getItem('userOptions') перед тем, как писать на него? Это может быть то, что его уничтожает.

AnonymousSB 09.12.2018 01:49

Да, я добавлю полный код. Я уверен, что элементы локального хранилища сохраняются и не перезаписываются моим кодом. Я без проблем использую и отлаживаю страницу уже несколько месяцев. Проблема возникла совсем недавно, когда я добавил кнопку Patreon. Кроме того, если пользователь закрывает вкладку и открывает мою страницу в новой вкладке, исходные объекты локального хранилища появляются снова. Я действительно подозреваю, что с кортежем протокол-домен-порт во время перенаправления происходит некоторая странность, но я не уверен.

BitPusher16 09.12.2018 02:03

Как скоро после сохранения на localStorage вы будете выполнять перенаправление с помощью Patreon? сохранение в localStorage - это асинхронный вызов, поэтому, если оба события происходят одновременно, он не сохранит его вовремя. Если да, можете использовать window.onbeforeunload = function() {localStorage.setItem()}

AnonymousSB 09.12.2018 02:10

Интересный. Не думал, что запись в localStorage будет асинхронной. Но данные определенно сохраняются. Чтение / запись в localStorage происходит сразу же при инициализации страницы, а перенаправление из Patreon происходит только тогда, когда пользователь нажимает кнопку Patreon. Эти два события можно разделить на любое время. От 5 секунд до 10 минут и более. И снова, если пользователь закрывает вкладку и открывает мою страницу на новой вкладке, старые значения localStorage (записанные до того, как пользователь перешел на Patreon) снова появляются со всеми значениями, установленными там, где пользователь их оставил.

BitPusher16 09.12.2018 02:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
594
1

Ответы 1

Потратил несколько часов на поиски и отладку, но до сих пор не понял первопричину. Текущий обходной путь - установить для Patreon href target значение «_blank», чтобы процесс аутентификации patreon происходил в отдельном окне.

Другие вопросы по теме