Questa pagina si applica a Apigee e Apigee ibridi.
Visualizza la documentazione di Apigee Edge.
CORS (Cross-Origin Resource Sharing) è un meccanismo standard che consente alle chiamate XMLHttpRequest (XHR) di JavaScript eseguite in una pagina web di interagire con le risorse di domini diversi da quello di origine. CORS è una soluzione comunemente implementata per criterio della stessa origine applicato da tutti i browser. Ad esempio, se effettui una chiamata XHR all'API Twitter dal codice JavaScript in esecuzione nel browser, la chiamata non andrà a buon fine. Questo perché il dominio che pubblica la pagina il tuo browser non corrisponde al dominio che gestisce l'API Twitter. CORS offre una soluzione questo problema consentendo ai server di eseguire l'attivazione se vogliono fornire risorse multiorigine condivisione.
Caso d'uso tipico di CORS
Il seguente codice JQuery chiama un servizio target fittizio. Se eseguita nel contesto di un browser (una pagina web), la chiamata non andrà a buon fine a causa del criterio della stessa origine:
<script> var url = "http://service.example.com"; $(document).ready(function(){ $("button").click(function(){ $.ajax({ type:"GET", url:url, async:true, dataType: "json", success: function(json) { // Parse the response. // Do other things. }, error: function(xhr, status, err) { // This is where we end up! } }); }); }); </script>
Una soluzione a questo problema è creare un proxy API Apigee che chiami l'API di servizio su il backend. Ricorda che Apigee si trova tra il client (in questo caso un browser) e l'API di backend (il servizio). Poiché il proxy API viene eseguito sul server, non in un browser, è in grado di chiamare il servizio correttamente. A questo punto, non devi fare altro che collegare le intestazioni CORS alla risposta TargetEndpoint. Se il browser supporta CORS, queste intestazioni segnalano al browser che va bene rilassare il criterio della stessa origine, consentendo la chiamata API multiorigine.
Una volta creato il proxy con supporto CORS, puoi chiamare l'URL del proxy API anziché la nel tuo codice lato client. Ad esempio:
<script> var url = "http://myorg-test.apigee.net/v1/example"; $(document).ready(function(){ $("button").click(function(){ $.ajax({ type:"GET", url:url, async:true, dataType: "json", success: function(json) { // Parse the response. // Do other things. }, error: function(xhr, status, err) { // This time, we do not end up here! } }); }); }); </script>
Collegamento del criterio CORS alla richiesta PreFlow del ProxyEndpoint
Collegamento di un criterio Aggiungi CORS a un nuovo proxy API
Puoi aggiungere il supporto CORS a un proxy API collegando un criterio Aggiungi CORS al proxy API nei seguenti modi:
- Quando crei il criterio selezionando la casella di controllo Aggiungi intestazioni CORS in La pagina Sicurezza della procedura guidata Crea un proxy
- Aggiungendolo in un secondo momento dalla finestra di dialogo Aggiungi criterio.
Quando aggiungi il criterio CORS selezionando la casella di controllo, un criterio denominato Aggiungi CORS viene aggiunto automaticamente al sistema e allegato al preflight della richiesta TargetEndpoint.
Il criterio Aggiungi CORS aggiunge le intestazioni appropriate alla risposta. Fondamentalmente, le intestazioni permettono al browser di sapere con quali origini condividerà le sue risorse, i metodi che accetta e così via. Per saperne di più su queste intestazioni CORS, consulta il Consiglio di W3C per la condivisione delle risorse tra origini.
Ti consigliamo di modificare la norma nel seguente modo:
- Aggiungi le intestazioni
content-type
eauthorization
(obbligatorie per supportare l'autenticazione di base o OAuth2) all'intestazioneAccess-Control-Allow-Headers
, come mostrato nell'estratto di codice di seguito. - Per l'autenticazione OAuth2, potrebbe essere necessario adottare misure per correggere un comportamento non conforme allo standard RFC.
<CORS continueOnError="false" enabled="true" name="add-cors"> <DisplayName>Add CORS</DisplayName> <AllowOrigins>{request.header.origin}</AllowOrigins> <AllowMethods>GET, PUT, POST, DELETE</AllowMethods> <AllowHeaders>origin, x-requested-with, accept, content-type, authorization</AllowHeaders> <ExposeHeaders>*</ExposeHeaders> <MaxAge>3628800</MaxAge> <AllowCredentials>false</AllowCredentials> <GeneratePreflightResponse>true</GeneratePreflightResponse> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </CORS>
Aggiunta di intestazioni CORS a un proxy esistente
Nuovo editor proxy
Per aggiungere il criterio CORS a un proxy API esistente:
Se utilizzi l'interfaccia utente di Apigee nella console Cloud: seleziona Sviluppo proxy > Proxy API.
Se utilizzi la UI di Apigee classica: seleziona Sviluppa > Proxy API e, nel riquadro Proxy, seleziona l'ambiente per il proxy.
- Seleziona il proxy API a cui vuoi aggiungere il criterio CORS.
- Nell'editor del nuovo proxy API, fai clic sulla scheda Sviluppo.
- Nel riquadro a sinistra, fai clic sul pulsante + nella riga Criteri.
Nella finestra di dialogo Crea criterio, fai clic nel campo Seleziona il tipo di criterio e Scorri verso il basso fino a Sicurezza e seleziona CORS.
Inserisci i dettagli del criterio e fai clic su Crea.
- Nel riquadro a sinistra, fai clic su PreFlow in Endpoint di destinazione > predefinita.
- Fai clic sul pulsante + accanto a PreFlow nel riquadro Richiesta in basso a destra nell'editor visivo.
- Nella finestra di dialogo Passaggio Aggiungi criterio, seleziona il criterio CORS.
Fai clic su Aggiungi per allegare le norme.
Editor proxy classico
Per aggiungere il criterio CORS a un proxy API esistente:
- Accedi all'interfaccia utente di Apigee.
- Seleziona Sviluppa > Proxy API nella barra di navigazione a sinistra. Se vedi il pulsante Prova ora, fai clic per visualizzare la nuova visualizzazione Sviluppa.
- Seleziona il proxy API a cui vuoi aggiungere il criterio CORS.
- Nell'editor del nuovo proxy API, fai clic sulla scheda Sviluppa:
- Nel riquadro di navigazione a sinistra, fai clic su PreFlow in Endpoint di destinazione > predefinita.
- Fai clic sul pulsante +Passaggio in alto, corrispondente al PreFlow della richiesta. Viene visualizzato
un elenco classificato di tutti i criteri che puoi creare.
- Seleziona CORS nella categoria Sicurezza.
- Specifica un nome, ad esempio
Add CORS
, e fai clic su Aggiungi.
Di seguito è mostrata la vista Sviluppo.
Gestione di CORS richieste preflight
Per preflight CORS si intende l'invio di una richiesta a un server per verificare se supporta CORS. Le risposte preflight tipiche includono le origini che il server accetta CORS richieste da, un elenco di metodi HTTP supportati per le richieste CORS, intestazioni che possono essere se viene utilizzata nell'ambito della richiesta di risorsa, il tempo massimo per la risposta preflight verrà memorizzato nella cache e altri. Se il servizio non indica il supporto CORS o non vuole accettare multiorigine richieste dall'origine del client, il criterio multiorigine del browser verrà applicato in modo forzato Qualsiasi richiesta interdominio effettuata dal client per interagire con le risorse ospitate su tale server non riuscirà.
In genere, le richieste preflight CORS vengono effettuate con il metodo HTTP OPTIONS. Quando un server supporta CORS riceve una richiesta OPTIONS, restituisce un set di intestazioni CORS al client che indicare il livello di supporto di CORS. In seguito a questo handshake, il client sa cosa è autorizzato a richiedere dal dominio non di origine.
Per ulteriori informazioni sul preflight, consulta la Recommendation del W3C sulla condivisione delle risorse tra origini. Esistono inoltre numerosi blog e articoli sul CORS a cui puoi fare riferimento.
Apigee non include una soluzione preflight CORS pronta all'uso, ma è possibile come descritto in questa sezione. L'obiettivo è che il proxy valuti un OPTIONS una richiesta in un flusso condizionale. Il proxy può quindi inviare una risposta appropriata al client.
Esaminiamo un flusso di esempio e poi parliamo delle parti che gestiscono la richiesta preflight:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ProxyEndpoint name="default"> <Description/> <Flows> <Flow name="OptionsPreFlight"> <Request> <Step> <Name>add-cors</Name> </Step> </Request> <Response/> <Condition>request.verb == "OPTIONS" AND request.header.origin != null AND request.header.Access-Control-Request-Method != null</Condition> </Flow> </Flows> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <HTTPProxyConnection> <BasePath>/v1/cnc</BasePath> <VirtualHost>default</VirtualHost> <VirtualHost>secure</VirtualHost> </HTTPProxyConnection> <RouteRule name="NoRoute"> <Condition>request.verb == "OPTIONS" AND request.header.origin != null AND request.header.Access-Control-Request-Method != null</Condition> </RouteRule> <RouteRule name="default"> <TargetEndpoint>default</TargetEndpoint> </RouteRule> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> </ProxyEndpoint>
Le parti chiave di questo ProxyEndpoint sono le seguenti:
- Una RouteRule viene creata verso una destinazione NULL con una condizione per la richiesta OPTIONS. Tieni presente che
non è specificato nessun TargetEndpoint. Se la richiesta OPTIONS viene ricevuta e le intestazioni delle richieste Origin e Access-Control-Request-Method non sono nulle, il proxy restituisce immediatamente le intestazioni CORS in una risposta al client (bypassando l'obiettivo "backend" predefinito effettivo).
Per maggiori dettagli sulle condizioni di flusso e RouteRule, consulta Condizioni con variabili di flusso.
<RouteRule name="NoRoute"> <Condition>request.verb == "OPTIONS" AND request.header.origin != null AND request.header.Access-Control-Request-Method != null</Condition> </RouteRule>
- Viene creato un flusso OptionsPreFlight che aggiunge un criterio Add CORS, contenente il valore CORS
intestazioni, al flusso se viene ricevuta una richiesta OPTIONS e i campi Origine e
Le intestazioni delle richieste Access-Control-Request-Method non sono nulle.
<Flow name="OptionsPreFlight"> <Request> <Step> <Name>add-cors</Name> </Step> </Request> <Response/> <Condition>request.verb == "OPTIONS" AND request.header.origin != null AND request.header.Access-Control-Request-Method != null</Condition> </Flow>