Dobrý den týme JS API,
Čelím problému, kdy náš SSO uplatňuje zpřísněná bezpečnostní opatření a úmyslně vymaže `window.opener`.
Pracuji na integraci s Octave (také známým jako EAM), který poskytuje ArcGIS Plugin. Jejich klientská aplikace následuje vzor a dokumentaci poskytnutou Esri, ale v důsledku toho je integrace momentálně nefunkční: ověření proběhne úspěšně, ale callback již nemůže vrátit OAuth odpověď rodičovské aplikaci, protože `window.opener` není dostupný [1].
Nemyslím si, že by za to mohl EAM/Octave, protože následují nejpřímější cestu poskytnutou SDK pomocí `oauth-callback-html` [1], která je zmíněna v dokumentaci [2],[3].
Po konzultaci s naším bezpečnostním týmem jsem zjistil, že tato situace není nutně specifická jen pro náš SSO. Moderní mechanismy izolace prohlížeče jako Cross-Origin-Opener-Policy (COOP) mohou také úmyslně přerušit vztah popup/opener.
Zdá se tedy, že SDK by mohlo být robustnější a lépe sladěné s aktuálními bezpečnostními praktikami tím, že bude podporovat i prostředí, kde window.opener není dostupný.
Jednou z možných alternativ by bylo použít stejný původ BroadcastChannel mezi callback stránkou a aplikací jako záložní řešení, když window.opener není dostupný. Microsoft MSAL Browser například používá podobný přístup k podpoře ověřování v popup okně v prostředích s COOP [4].
Bylo by skvělé, kdyby byl OAuth popup přihlašovací tok vylepšen tak, aby podporoval taková prostředí. Externí dodavatelé integrující se s ArcGIS pravděpodobně budou následovat oficiální vzory a jinak by mohli předpokládat, že window.opener bude během celého ověřovacího procesu vždy dostupný.
Děkuji za pozornost!
Reference:
[1]
https://github.com/Esri/jsapi-resources/blob/main/oauth/oauth-callback.html
[2]
https://developers.arcgis.com/javascript/latest/references/core/identity/OAuthInfo/#popup
[3]
https://developers.arcgis.com/javascript/latest/sample-code/identity-oauth-basic/
[4]
https://learn.microsoft.com/en-us/entra/msal/javascript/browser/login-user
PS: Mám otevřený případ (04242886) a doporučili mi zde zveřejnit příspěvek.