Wpis z mikrobloga

Mam pewien problem kodowy Wyobraźcie sobie taką sytuacje mam 2 strony A i B w różnych domenach, strony mogą być otwarte niezależnie. Strona A ma skrypt który sprawdza czy użytkownik coś na niej zrobił w ciągu ostatnich 5 min, jak nie to go wylogowuje
Strona B ma w ramce stronę w domenie strony A nazijmy ją C która jest niewidzialna i używając post message przekazuje jej informacje o aktywności usera (tylko informacje, że użytkownik coś zrobił np. kliknał myszą).

I teraz wcześniej strona C ustawiał w localstorage jakąś zmienną z wartością timestampa, a strona A nasłuchiwała na zmiany w localstorage i jak w storage zmieniła się wartość timestampa to resetowała licznik nieaktywności użytkownika (czyli kolejne 5 min user nie był wylogowywany)

Problem jest taki, że w 2023 zostały zrobione partycje w storage i strona C ma inne wartości niż strona A i nie ma teraz między nimi komunikacji. Czy ktoś miał może podobny pomysł i go jakoś obszedł bez implementacji po stronie BE?
Jak na razie próbowałem
-broadcastchannel - jak się okazuje również partycje dotknęły
-sharedWorker - bez sukcesów

Dodajmy, że oryginalny skrypt był napisany 8 lat temu i dopiero po roku ktoś zauważył, że przestał działać :)

#programowanie #javascript #frontend
  • 10
  • Odpowiedz
@lobo: a zwykły window.postMessage i window.addEventListener('message')? C wysyła, A nasł#!$%@?. Ewentualnie gdyby tak nie pykło to jeśli masz jakąś kontrolę nad B to i B mogłoby nasłuchiwać na message event i przekazywać go dalej do A, ale wydaje mi się że to nie jest konieczne.
  • Odpowiedz
via Wykop
  • 0
@Marmite: do postmessage potrzebujesz targetOrigin łączący A z B a tego niestety nie mam bo B może zostać otworzone z innych stron

Technicznie postMessage używam do komunikacji B z C bo one mają dostęp do swoich originów, ale A i B nie mają tych informacji między sobą.
  • Odpowiedz
via Wykop
  • 0
@Marmite: Przepraszam może się źle wyraziłem :) przy postmessage musisz mieć kontekst jak komunikujesz się ramka parent to wygląda tak:
parent -> iframe.contentWindow.postMessage
iframe -> window.top.postMessage

czyli technicznie obiekt window miejsca do którego chcesz wysłać, a niestety tego brak między A i B
  • Odpowiedz
@lobo: ok, źle zapamiętałem to API z czasów jak się tym bawiłem parę miesięcy temu, wydawało mi się że można sobie to puścić tak o w eter, że nie trzeba mieć fizycznej referencji do window który to odbiera bo kto będzie zainteresowany to sobie odbierze. Ale faktycznie, trzeba mieć referencję.
W takiej sytuacji to bym myślał o workerze, ale mówisz że bez sukcesu.
Jak tego nie rozwiążesz to wieczora to
  • Odpowiedz
via Wykop
  • 0
@lunaexoriens: Jasne, ale służy do komunikacji między stronami w tej samej domenie, w mojej sytuacji nie zadziała bo mimo, że ramka C jest w tej samej domenie co strona A to przez to, że jest umieszcona w B to przez storage partitioning nie mogą się komunikować między sobą, jakbym odpalił drugą stronę B to C między nimi już by mogły się komunikować https://developers.google.com/privacy-sandbox/3pcd/storage-partitioning

Ech chyba bez BE się nie obejdzie
-service i shared workery niestety nie działa
-BroadcastChannel nie działa
-postMessage dla tego case jak nie mam openera to również
  • Odpowiedz
via Wykop
  • 0
I ddodajmy, że storage access api wymaga interackji usera z ramką, a tego niestety zrobić nie mogę bo ramka niewidzialna :/
  • Odpowiedz
@lobo: wygląda mi na problem XY

Jaki jest prawdziwy problem, co chcecie uzyskać dla użytkownika? Po to wprowadzono partycje aby takich rzeczy jak chcesz zrobić nie dało się robić.
  • Odpowiedz
via Wykop
  • 0
@Krolik: Problem jest prosty strona A należy do nas, strona B należy do klienta. Klient używa naszej strony do integracji swoich starych serwisów + integracji z jeszcze innym serwisem i nasza strona ogarnia SSO dla tych serwisów, robi za pośrednika api etc. ogólnie taki potężny crm, ale zgodnie z wymaganiami jak użytkownik na naszej stronie jest nieaktywny przez x czasu to go musimy wylogować + wylogować ze wszystkich sesji. I teraz problem jest taki, że klienci mogą wejść na strony zewnętrzne z naszej strony (które sobie pokonfigurowali) i odpalają się one w nowym tabie (jest mnóstwo miejsc z których mogą tak przejść) i na tych stronach mogą przebywać dłużej niż X.

I takich klientów ze swoimi stronami mamy dziesiątki i nie jesteśmy w stanie nic oprócz umieszczenia naszego pliku js na ich stronach zrobić. Nasz mechanizm był banalny i zwyczajnie wstawialiśmy niewidoczną ramkę z naszą stroną A która jedyne co robiła to gdy dostała ze strony B informacje postmessage, że user coś kliknął albo napisał to ustawiał w localstorage w konkretnej zmiennej timestampa i nasza strona na to reagowała przedłużając sesje. Dosłownie nie potrzebujemy słać żadnych danych innych niż nawet pusty ping który bylibyśmy w stanie przechwycić.

Ogólnie flow dla użytkownika końcowego w niektórych sytuacjach wyglądał tak
-łazi po
  • Odpowiedz