Flash message v iframu po redirectu
- ForestCZE
- Člen | 209
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.
- jiri.pudil
- Nette Blogger | 1029
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 | 493
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 | 1029
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
@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 | 1029
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?
- jiri.pudil
- Nette Blogger | 1029
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
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 | 1029
Ano, SameSite=None
ponovu vyžaduje Secure
, což
ovšem vyžaduje HTTPS.
- dms
- Člen | 93
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í?