Flash message v iframu po redirectu

ForestCZE
Člen | 209
+
0
-

Ahoj, používám klasické flash messages. Nemám to nijak upravené. V prohlížeči (testováno v IE, Edge, Chrome) mi to chybové (bez přesměrování) normálně vyhodí a úspěšné (s přesměrováním) taky. Jakmile to ale načtu do

<iframe></iframe>

tak to vyhodí jen ty chybové. U těch úspěšných dojde pouze k přesměrování a flash message nikde. Nějaké nápady?
Ps. tuším, že se to začalo dít až po updatu vendoru, ale jistý si úplně nejsem.

dakur
Člen | 340
+
0
-

🤷‍♂️ Asi příliš obecný popis řekl bych. Nějak si ani neumím představit jak to máš udělané… To jakože máš nette web a flash messages načítáš special do iframe? Nebo máš nette web celý v iframe?

ForestCZE
Člen | 209
+
0
-

dakur napsal(a):

🤷‍♂️ Asi příliš obecný popis řekl bych. Nějak si ani neumím představit jak to máš udělané… To jakože máš nette web a flash messages načítáš special do iframe? Nebo máš nette web celý v iframe?

@dakur Celý nette web je v iframe.

dakur
Člen | 340
+
0
-

Nemůže za to nějaká browser extension? Že by třeba ten success vyhodnotila jako reklamu nebo tak něco? Není ten success v DOM přítomen, jen má třeba display: none? Nic nette-specific mě k tomu nenapadá..

jiri.pudil
Nette Blogger | 1007
+
+2
-

Moje teorie je Same-Site session cookie. Nette zdá se defaultně nastavuje Lax, což má za následek to, že moderní browser takto označenou sušenku neposílá v cross-origin kontextech (jako je třeba iframe, pokud je na jiné doméně než vnější stránka). Díky tomu by se ti nepřenášela session, kterou flash message pro svou funkčnost potřebují.

dakur
Člen | 340
+
0
-

No jo, to je pak ještě otázka, co @ForestCZE myslím těmi chybovými flash messages. Jestli opravdu flash messages – $this->flashMessage('chyba', 'error'), nebo chyby formuláře – $form->addError('chyba') – co jsou nastylované jako flash message.

V prvním případě by se pak neměly vykreslit v případě cookie problému ani ty, ne? V případě form errorů jo, ty se nepředávají přes session, ale rovnou vykreslují..

Editoval dakur (21. 7. 2021 13:02)

jiri.pudil
Nette Blogger | 1007
+
0
-

To je jedno, důležité je to „bez přesměrování“. V rámci stejného requestu budou myslím fungovat i flash message, protože se kromě session ukládají rovnou i lokálně do šablony.

ForestCZE
Člen | 209
+
0
-

@dakur jedná se o $this->flashMessage('hláška')

@jiripudil Nemyslím si, že by měl být problém s cookies v rámci cross-origin.

Všechny formuláře mají nastaveno: $form->allowCrossOrigin() a v xxxSucceeded pak dochází k vystřelení flashMessage a přesměrování. Všechno se zpracuje a flashMessage se nezobrazí, pokud po ní dojde k přesměrování (proto píšu, že chybové fungují, jelikož uživateli vyhodím chybu a zůstává, kde je). Jenže mimo iframe fungují i ty úspěšné, dojde k přesměrování a flashMessage normálně vidím.

jiri.pudil
Nette Blogger | 1007
+
+3
-

Všechny formuláře mají nastaveno: $form->allowCrossOrigin()

To nijak* nesouvisí s cookies, ovlivňuje to jenom to, jestli se formulář z cross-origin kontextu vůbec zpracuje.

*) A vlastně to tak trochu souvisí, protože Nette detekuje cross-origin requesty právě podle absence Same-Site cookie, kterou vždy posílá.

Pokud jsi tedy přidával allowCrossOrigin kvůli tomu, že se jinak formulář v iframe nezpracoval, jen mě to utvrzuje v tom, že moje domněnka se Same-Site session cookie pořád dává smysl. Obzvlášť s ohledem na to, že ti ty flash message nefungují právě jenom v iframe.

Ale ty jsi z nás všech jediný, kdo to dokáže ověřit: když se podíváš v dev tools na ten request po přesměrování, posílá v něm browser hlavičku s cookies? Pokud ano, obsahuje i cookie se session ID?

ForestCZE
Člen | 209
+
0
-

@jiripudil Nevím, jestli je to to, co hledáme, ale tady je něco (v dev tools), co asi ukazuje na ten problém.

Editoval ForestCZE (24. 7. 2021 20:17)

jiri.pudil
Nette Blogger | 1007
+
+2
-

Ano, přesně tohle hledáme. Flash message se napříč requesty ukládají do session a session ID se posílá právě v téhle cookie. Jelikož ale ta cookie má SameSite=Lax, browser ji v cross-origin kontextech (jako je mj. iframe) ignoruje. Server pak nemá podle čeho poznat, která session patří tomuhle requestu, takže pro něj prostě otevře novou, prázdnou session, a tu, ve které jsou uložené flash message, zahodí.

Myslím, že budeš muset tu same-site ochranu vypnout:

session:
	cookieSamesite: None
ForestCZE
Člen | 209
+
0
-

jiri.pudil napsal(a):

Ano, přesně tohle hledáme. Flash message se napříč requesty ukládají do session a session ID se posílá právě v téhle cookie. Jelikož ale ta cookie má SameSite=Lax, browser ji v cross-origin kontextech (jako je mj. iframe) ignoruje. Server pak nemá podle čeho poznat, která session patří tomuhle requestu, takže pro něj prostě otevře novou, prázdnou session, a tu, ve které jsou uložené flash message, zahodí.

Myslím, že budeš muset tu same-site ochranu vypnout:

session:
	cookieSamesite: None

@jiripudil Někam jsem se posunul, ale stále to nefunguje. Nyní to po mně chce, abych nastavil Secure, tak mám v configu:

http:
	frames: true
	cookieSecure: true

Ale stále se tomu nechce. Nevím, jestli nevadí, že to běží na http a ne na https.

jiri.pudil
Nette Blogger | 1007
+
+1
-

Ano, SameSite=None ponovu vyžaduje Secure, což ovšem vyžaduje HTTPS.

dms
Člen | 47
+
0
-

Nejhorší je, že to nefunguje v Safari :( tam se v iframu cookies nespustí vůbec pokud to je na rozdílných doménách. Jsou na to různé hacky, ale bohužel nic hezkého viz např https://gist.github.com/…baaa60b79206 nemá někdo na tohle řešení?