Uno scenario ricorrente nelle applicazioni web è quello in cui la pagina, mediante JavaScript e XmlHttpRequest, accede a dei dati consumando un servizio REST.
In questo scenario, per attenuare i rischi derivanti da attacchi di tipo "Cross Site Scripting" o "Man in the middle", i browser applicano una restrizione, detta same-origin, per assicurare un livello di sicurezza adeguato e scongiurare gli attacchi citati.
Tutto questo si traduce, in sintesi, nell'impossibilità di accesso dati esposti da un servizio REST-based sul dominio www.myPublicAPI.com, da parte di un'applicazione web esposta su un dominio diverso, ad esempio www.myWebApp.com.
Esistono diversi workaround per aggirare la restrizione same-origin, uno è JSONP ovvero JSON with Padding. Questo espediende consiste nell'iniettare uno script, esposto come risorsa remota su un dominio differente. Tipicamente si tratta di una risorsa fittizia, rappresentata da una response costruita server-side (ASP.NET, PHP, etc) contenente codice Javascript + dati JSON, entrambi vengono utilizzati client-side, nella pagina richiedente, per servire la richiesta iniziale.
Fin dalla versione 1.2, JQuery supporta questo workaround fornendo una sintassi semplificata, simile a quella utilizzata nelle normali richieste AJAX, per effettuare una richiesta JSONP:
$.getJSON("www.myPublicAPI.com?value=12345&callback=?", function(rawData) { //Todo: gestire i dati ritornati });
il parametro callback è opzionale e consente di specificare una funzione personalizzata, da richiamare in seguito al completamento della richiesta JSONP, nell'esempio si è fatto ricorso ad una funzione passata direttamente come parametro del metodo getJSON.
Per avere evidenza di quanto illustrato, è sufficiente utilizzare un tool come Fiddler (http://www.fiddler2.com), per analizzare la response ottenuta richiamando una risorsa JSONP, ad esempio:
http://api.flickr.com/services/feeds/photos_public.gne?tags=desmo16&tagmode=any&format=json&jsoncallback=myCustomName
Con HTML5 si ha facoltà di disabilitare la restrizione same-origin, consentendo chiamate AJAX verso domini differenti, a patto di includere nella response (prodotta "server-side") contenente i dati l'header Access-Control-Allow-Origin in cui sono specificati i domini autorizzati ad effettuare chiamate.
Riprendendo l'esempio citato in apertura, la response prodotta dall'ipotetico servizio REST www.myPublicAPI.com, dovrà contenere l'header:
Access-Control-Allow-Origin:www.myWebApp.com
Oppure, se s'intende esporre pubblicamente l'api, senza alcuna limitazione (ma con tutti i rischi del caso), sarà sufficiente specificare:
Access-Control-Allow-Origin:*
La specifica prevede anche altri due headers:
- Access-Control-Max-Age: indica l'intervallo di tempo (in secondi) in cui mantenere in cache la response
- Access-Control-Allow-Methods: indica esplicitamente quali metodi HTTP sono autorizzati, in particolare serve per autorizzare PUT e/o DELETE, in quanto i metodi GET, POST, HEAD sono autorizzati di default.
La specifica completa è disponibile qui: http://www.w3.org/TR/cors/
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare QuickGrid di Blazor con Entity Framework
Eseguire una query su SQL Azure tramite un workflow di GitHub
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Applicare un filtro per recuperare alcune issue di GitHub
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Generare token per autenicarsi sulle API di GitHub
Ordinare randomicamente una lista in C#
Usare lo spread operator con i collection initializer in C#
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Usare il colore CSS per migliorare lo stile della pagina
I più letti di oggi
- Utilizzare AAD su SQL Database durante lo sviluppo con Visual Studio
- Utilizzare il TransferControl in Windows Phone
- Gestione dei token negli input di testo con la Universal Windows Platform
- Dare temporaneamente accesso ad un blob di Azure Storage
- Impostare le policy CORS con Azure API Management
- Utilizzare database e servizi con gli add-on di Container App
- Utilizzare HttpModule in modalità asincrona
- Indicizzare i Blob Storage con Azure Search
- Creazione di StateTrigger personalizzati in Universal Windows Platform
- Modificare i criteri della clausola Where del LinqDataSource di ASP.NET