In un gestionale che ho scritto in Web2py incorporo alcune pagine di un’installazione di Odoo 12 che risiede su un server diverso.
Le recenti politiche di sicurezza dei browser hanno reso impossibile questo comportamento a meno di una autorizzazione esplicita del sito incorporato.
Il problema è che né Odoo 12 né la versione installata del server Nginx che uso come reverse proxy gestiscono questa possibilità.
Come fare?
Bisogna intervenire in due punti.
La prima operazione, che è quella più sporca ma al momento non ho trovato altre soluzioni, è modificare il file http.py che si trova nella cartella principale di Odoo.
Questo file è quello che implementa l’applicazione WSGI ed è basato su Werkzeug (come Flask).
Nella funzione get_response() della classe Root, verso la fine c’è il blocco seguente in cui viene impostato il cookie di sessione:
if not explicit_session and hasattr(response, 'set_cookie'):
response.set_cookie(
'session_id', httprequest.session.sid, max_age=90 * 24 * 60 * 60, httponly=True)
Subito dopo dobbiamo aggiungere l’istruzione che aggiunge al cookie la gestione delle autorizzazioni per essere incorporato:
response.headers.set('Set-Cookie', response.headers.get('Set-Cookie')+'; SameSite=None; Secure;')
Più nello specifico questa istruzione aggiunge gli attributi SameSite=None e Secure al cookie di sessione, in modo che possa venire usato anche se il sito è incorporato.
Dopo la modifica bisogna riavviare Odoo.
L’altra operazione da fare, questa volta molto più normale, è aggiungere l’header HTTP Content-Security-Policy alla sezione server del file di configurazione di Ngnix. Quello che sta in sites-available, per intenderci.
Io l’ho aggiunto quasi all’inizio, subito dopo il primo blocco in cui è definito il server_name:
add_header Content-Security-Policy "frame-ancestors http://localhost:8000 https://www.sito_incorporante.com";
Dopo questa modifica dovremo riavviare Nginx.
Attenzione!
La prima modifica che abbiamo fatto, quella al file http.py, verrà sovrascritta da un aggiornamento di Odoo (sorgenti, pacchetto o immagine del container Docker). Quindi dovremo ripeterla fintanto che i due attributi del cookie verranno gestiti in maniera nativa da Odoo.