Estensioni OpenAPI 2.0 in API Gateway
API Gateway accetta un insieme di estensioni specifiche di Google alla specifica OpenAPI che configurano i comportamenti del gateway. Questa pagina descrive le estensioni personalizzate specifiche di Google alla specifica OpenAPI 2.0 utilizzate per configurare i comportamenti di API Gateway, come il routing del backend, l'autenticazione e le funzionalità di gestione delle API.
Sebbene gli esempi forniti siano in formato YAML, è supportato anche JSON.
Convenzione di denominazione
Le estensioni Google OpenAPI hanno nomi che iniziano con il prefisso x-google-.
x-google-allow
x-google-allow: [configured | all]
Questa estensione viene utilizzata al livello superiore di una specifica OpenAPI per indicare quali percorsi URL devono essere consentiti tramite API Gateway.
I valori possibili sono configured e all.
Il valore predefinito è configured, il che significa che solo i metodi API elencati nella specifica OpenAPI vengono pubblicati tramite API Gateway.
Quando viene utilizzato all, le chiamate non configurate, con o senza una chiave API o l'autenticazione utente, passano attraverso API Gateway alla tua API.
API Gateway elabora le chiamate alla tua API in modo sensibile alle maiuscole e minuscole.
Ad esempio, API Gateway considera /widgets e /Widgets come
metodi API diversi.
Quando viene utilizzato all, devi prestare particolare attenzione a due aspetti:
- Qualsiasi chiave API o regola di autenticazione.
- Il routing del percorso di backend nel tuo servizio.
Come best practice, ti consigliamo di configurare l'API in modo che utilizzi il routing dei percorsi sensibile alle maiuscole. Se utilizzi il routing sensibile alle maiuscole e minuscole, la tua API restituisce
un codice di stato HTTP 404 quando il metodo richiesto nell'URL non
corrisponde al nome del metodo API elencato nella specifica OpenAPI. Tieni presente
che i framework di applicazioni web come Node.js Express hanno un'impostazione per
attivare o disattivare il routing sensibile alle maiuscole. Il comportamento predefinito dipende dal
framework che stai utilizzando. Ti consigliamo di rivedere le impostazioni nel
framework per assicurarti che il routing sensibile alle maiuscole sia attivato. Questo
consiglio è in linea con la specifica OpenAPI v2.0
che afferma: "Tutti i nomi dei campi nella specifica sono sensibili alle maiuscole e minuscole".
Esempio
Supponi che:
x-google-allowè impostato suall.- Il metodo API
widgetsè elencato nella specifica OpenAPI, ma non inWidgets. - Hai configurato la specifica OpenAPI in modo che richieda una chiave API.
Poiché widgets è elencato nella specifica OpenAPI, API Gateway blocca la seguente richiesta perché non ha una chiave API:
https://my-project-id.appspot.com/widgets
Poiché Widgets non è elencato nella specifica OpenAPI, API Gateway
trasmette la seguente richiesta al tuo servizio senza una chiave API:
https://my-project-id.appspot.com/Widgets/
Se la tua API utilizza il routing sensibile alle maiuscole e minuscole (e non hai indirizzato le chiamate
a "Widget" a nessun codice), il backend API restituisce un 404. Se, tuttavia, utilizzi il routing senza distinzione tra maiuscole e minuscole, il backend API indirizza questa chiamata a "widgets".
Linguaggi e framework diversi hanno metodi diversi per controllare la distinzione tra maiuscole e minuscole e il routing. Per maggiori dettagli, consulta la documentazione del framework.
x-google-backend
L'estensione x-google-backend specifica come instradare le richieste ai backend remoti. L'estensione può essere specificata a livello
superiore, a livello di operazione o a entrambi i livelli di una specifica OpenAPI.
L'estensione x-google-backend può anche configurare altre impostazioni per i backend remoti,
come autenticazione e timeout. Tutte queste configurazioni
possono essere applicate in base all'operazione.
L'estensione x-google-backend contiene i seguenti campi:
address
address: URL
Obbligatorio. L'URL del backend di destinazione.
Lo schema dell'indirizzo deve essere http o https.
Quando il routing viene eseguito verso backend remoti (serverless), l'indirizzo deve essere impostato e la
parte dello schema deve essere https.
jwt_audience | disable_auth
Deve essere impostata solo una di queste due proprietà.
Se un'operazione utilizza x-google-backend, ma non specifica jwt_audience o disable_auth, API Gateway imposterà automaticamente jwt_audience in modo che corrisponda a address.
Se address non è impostato, API Gateway imposterà automaticamente disable_auth su true.
jwt_audience
jwt_audience: string
Facoltativo. Il pubblico JWT specificato quando API Gateway ottiene un token ID istanza, che viene poi utilizzato quando viene effettuata la richiesta di backend di destinazione.
Quando configuri API Gateway per Serverless, il backend remoto deve essere protetto per consentire solo il traffico da API Gateway. API Gateway
collegherà un token ID istanza all'intestazione Authorization durante il proxy delle richieste.
Il token ID istanza rappresenta il account di servizio di runtime utilizzato per
il deployment di API Gateway. Il backend remoto può quindi verificare che la richiesta provenga da
API Gateway in base a questo token allegato.
Ad esempio, un backend remoto di cui è stato eseguito il deployment su Cloud Run può utilizzare Identity and Access Management (IAM) per:
- Limita le chiamate non autenticate revocando
roles/run.invokerdall'entità specialeallUsers. - Consenti solo ad API Gateway di richiamare il backend concedendo il ruolo
roles/run.invokeral account di servizio di runtime di API Gateway.
Per impostazione predefinita, API Gateway crea il token ID istanza con un
pubblico JWT che corrisponde al campo address. La specifica manuale di
jwt_audience è necessaria solo quando il backend di destinazione utilizza l'autenticazione
basata su JWT e il pubblico previsto è diverso dal valore specificato
nel campo address.
Per i backend remoti di cui è stato eseguito il deployment su App Engine o con Identity-Aware Proxy (IAP), devi eseguire l'override del
pubblico JWT. App Engine e IAP utilizzano il proprio ID client OAuth come pubblico previsto.
Quando questa funzionalità è abilitata, API Gateway modificherà le intestazioni nelle richieste.
Se una richiesta ha già impostato l'intestazione Authorization, API Gateway:
- Copia il valore originale in una nuova intestazione
X-Forwarded-Authorization. - Esegui l'override dell'intestazione
Authorizationcon il token ID istanza.
Pertanto, se un client API imposta l'intestazione Authorization, un backend in esecuzione
dietro API Gateway deve utilizzare l'intestazione X-Forwarded-Authorization per
recuperare l'intero JWT. Il backend deve
verificare il JWT in questo header, poiché API Gateway non esegue
la verifica quando i metodi di autenticazione
non sono configurati.
Per esempi di configurazione, vedi Creazione di una configurazione API.
disable_auth
disable_auth: bool
Facoltativo. Questa proprietà determina se API Gateway deve impedire l'ottenimento di un token ID istanza e impedirne l'allegato alla richiesta.
Quando configuri il backend di destinazione, potresti non voler utilizzare IAP o IAM per autenticare le richieste da API Gateway se si verifica una di queste condizioni:
- Il backend deve consentire chiamate non autenticate.
- Il backend richiede l'intestazione
Authorizationoriginale dal client API e non può utilizzareX-Forwarded-Authorization(descritto nella sezionejwt_audience).
In questo caso, imposta questo campo su true.
path_translation
path_translation: [ APPEND_PATH_TO_ADDRESS | CONSTANT_ADDRESS ]
Facoltativo. Imposta la strategia di traduzione del percorso utilizzata da API Gateway quando esegue il proxy delle richieste al backend di destinazione.
Per ulteriori dettagli sulla traduzione dei percorsi, consulta la sezione Comprendere la traduzione dei percorsi.
Quando x-google-backend viene utilizzato al livello superiore della specifica OpenAPI, path_translation viene impostato per impostazione predefinita su APPEND_PATH_TO_ADDRESS e quando x-google-backend viene utilizzato a livello di operazione della specifica OpenAPI, path_translation viene impostato per impostazione predefinita su CONSTANT_ADDRESS. Se il campo address non è presente, path_translation rimarrà non specificato e non si verificherà.
deadline
deadline: double
Facoltativo. Il numero di secondi di attesa per una risposta completa a una richiesta.
Le risposte che richiedono più tempo rispetto alla scadenza configurata andranno in timeout.
La scadenza predefinita è di 15.0 secondi.
I valori non positivi non verranno rispettati. API Gateway utilizzerà automaticamente il valore predefinito in questi casi.
La scadenza non può essere disattivata, ma può essere impostata su un numero elevato, ad esempio 600 secondi (la scadenza massima).
protocol
protocol: [ http/1.1 | h2 ]
Facoltativo. Il protocollo utilizzato per l'invio di una richiesta al backend.
I valori supportati sono http/1.1 e h2.
Il valore predefinito è http/1.1 per i backend HTTP e HTTPS.
Per i backend HTTP sicuri (https://) che supportano HTTP/2,
imposta questo campo su h2 per migliorare le prestazioni. Questa è l'opzione consigliata
per Google Cloud i backend serverless.
Informazioni sulla traduzione dei percorsi
Quando API Gateway gestisce le richieste, prende il percorso della richiesta originale e lo traduce prima di effettuare una richiesta al backend di destinazione. La modalità esatta di traduzione dipende dalla strategia di traduzione dei percorsi che utilizzi. Esistono due strategie di traduzione dei percorsi:
APPEND_PATH_TO_ADDRESS: il percorso della richiesta di backend di destinazione viene calcolato aggiungendo il percorso della richiesta originale all'URLaddressdell'estensionex-google-backend.CONSTANT_ADDRESS: il percorso della richiesta di destinazione è costante, come definito dall'URLaddressdell'estensionex-google-backend. Se il percorso OpenAPI corrispondente contiene parametri, il nome del parametro e il relativo valore diventanoparametri di ricercary.
Esempi:
APPEND_PATH_TO_ADDRESSaddress: https://my-project-id.appspot.com/BASE_PATH- Con i parametri di percorso OpenAPI
- Percorso OpenAPI:
/hello/{name} - Percorso della richiesta:
/hello/world - URL richiesta di destinazione:
https://my-project-id.appspot.com/BASE_PATH/hello/world
- Percorso OpenAPI:
- Senza parametri del percorso OpenAPI
- Percorso OpenAPI:
/hello - Percorso della richiesta:
/hello - URL richiesta di destinazione:
https://my-project-id.appspot.com/BASE_PATH/hello
- Percorso OpenAPI:
CONSTANT_ADDRESSaddress:https://us-central1-my-project-id.cloudfunctions.net/helloGET- Con i parametri di percorso OpenAPI
- Percorso OpenAPI:
/hello/{name} - Percorso della richiesta:
/hello/world - URL richiesta di destinazione:
https://us-central1-my-project-id.cloudfunctions.net/helloGET?name=world
- Percorso OpenAPI:
- Senza parametri del percorso OpenAPI
- Percorso OpenAPI:
/hello - Percorso della richiesta:
/hello - URL richiesta di destinazione:
https://us-central1-my-project-id.cloudfunctions.net/helloGET
- Percorso OpenAPI:
x-google-endpoints
Questa sezione descrive gli utilizzi dell'estensione x-google-endpoints.
Configura API Gateway per consentire le richieste CORS
Se la tua API viene chiamata da un'applicazione web su un'origine diversa, deve supportare la condivisione delle risorse tra origini (CORS). Consulta Aggiunta del supporto CORS ad API Gateway per informazioni sulla configurazione di API Gateway per supportare CORS.
Se devi implementare il supporto CORS personalizzato nel codice backend, imposta
allowCors: True in modo che API Gateway trasmetta tutte le richieste CORS al
codice backend:
x-google-endpoints: - name: "API_NAME.endpoints.PROJECT_ID.cloud.goog" allowCors: True
Aggiungi l'estensione x-google-endpoints al livello superiore del documento OpenAPI
(senza rientro o nidificazione), ad esempio:
swagger: "2.0" host: "my-cool-api.endpoints.my-project-id.cloud.goog" x-google-endpoints: - name: "my-cool-api.endpoints.my-project-id.cloud.goog" allowCors: True
x-google-issuer
x-google-issuer: URI | EMAIL_ADDRESS
Questa estensione viene utilizzata nella sezione securityDefinitions di OpenAPI per specificare
l'emittente di una credenziale. I valori possono assumere la forma di un nome host o di un indirizzo
email.
x-google-jwks_uri
x-google-jwks_uri: URI
URI del set di chiavi pubbliche del fornitore impostato per convalidare la firma del JSON Web Token.
Il campo x-google-jwks_uri (OpenAPI 2.0) o jwksUri (OpenAPI 3.x) è obbligatorio.
API Gateway supporta due formati di chiave pubblica asimmetrica definiti
da questa estensione OpenAPI:
-
Formato del set JWK.
Ad esempio:
OpenAPI 2.0
x-google-jwks_uri: "https://YOUR_ACCOUNT_NAME.YOUR_AUTH_PROVIDER_URL/.well-known/jwks.json"
OpenAPI 3.x
jwksUri: "https://YOUR_ACCOUNT_NAME.YOUR_AUTH_PROVIDER_URL/.well-known/jwks.json"
-
X509. Ad esempio:
OpenAPI 2.0
x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
OpenAPI 3.x
jwksUri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
Se utilizzi un formato di chiave simmetrica, imposta x-google-jwks_uri (OpenAPI 2.0) o jwksUri (OpenAPI 3.x) sull'URI di un file che contiene la stringa della chiave codificata in base64url.
x-google-jwt-locations
Per impostazione predefinita, un JWT viene passato nell'intestazione Authorization (con prefisso "Bearer "), nell'intestazione X-Goog-Iap-Jwt-Assertion o nel parametro di query access_token.
In alternativa, utilizza l'estensione x-google-jwt-locations nella sezione securityDefinitions di OpenAPI per fornire le posizioni personalizzate da cui estrarre il token JWT.
L'estensione x-google-jwt-locations accetta un elenco di posizioni JWT. Ogni posizione JWT contiene i seguenti campi:
| Elemento | Descrizione |
|---|---|
header/query |
Obbligatorio. Il nome dell'intestazione contenente il JWT o il nome del parametro di query contenente il JWT. |
value_prefix |
Facoltativo. Solo per l'intestazione. Quando value_prefix è impostato, il suo valore deve corrispondere al prefisso del valore dell'intestazione contenente il JWT. |
Ad esempio:
x-google-jwt-locations:
# Expect header "Authorization": "MyBearerToken <TOKEN>"
- header: "Authorization"
value_prefix: "MyBearerToken "
# expect header "jwt-header-foo": "jwt-prefix-foo<TOKEN>"
- header: "jwt-header-foo"
value_prefix: "jwt-prefix-foo"
# expect header "jwt-header-bar": "<TOKEN>"
- header: "jwt-header-bar"
# expect query parameter "jwt_query_bar=<TOKEN>"
- query: "jwt_query_bar"
Se vuoi supportare solo un sottoinsieme delle posizioni JWT predefinite, elencale in modo esplicito nell'estensione x-google-jwt-locations. Ad esempio, per includere il supporto solo per l'intestazione Authorization con il prefisso "Bearer ":
x-google-jwt-locations:
# Support the default header "Authorization": "Bearer <TOKEN>"
- header: "Authorization"
value_prefix: "Bearer "
x-google-audiences
x-google-audiences: STRING
Questa estensione viene utilizzata nella sezione securityDefinitions di OpenAPI per fornire
un elenco di segmenti di pubblico a cui deve corrispondere il campo JWT aud durante l'autenticazione JWT.
Questa estensione accetta una singola stringa con valori separati da una virgola. Gli spazi
non sono consentiti tra i segmenti di pubblico. Se non è specificato, il campo JWT aud
deve corrispondere al campo host nel documento OpenAPI.
securityDefinitions:
google_id_token:
type: oauth2
authorizationUrl: ""
flow: implicit
x-google-issuer: "https://accounts.google.com"
x-google-jwks_uri: "https://www.googleapis.com/oauth2/v1/certs"
x-google-audiences: "848149964201.apps.googleusercontent.com,841077041629.apps.googleusercontent.com"
x-google-management
L'estensione x-google-management controlla diversi aspetti della gestione delle API e contiene i campi descritti in questa sezione.
metrics
Utilizzi metrics insieme a quota e x-google-quota
per configurare una quota per la tua API. Una quota ti consente di controllare la frequenza con cui le applicazioni possono chiamare i metodi nella tua API. Ad esempio:
x-google-management:
metrics:
- name: read-requests
displayName: Read requests
valueType: INT64
metricKind: DELTA
Il campo metrics contiene un elenco con le seguenti coppie chiave-valore:
| Elemento | Descrizione |
|---|---|
| nome | Obbligatorio. Il nome di questa metrica. In genere, questo è il tipo di richiesta (ad esempio "read-requests" o "write-requests") che identifica in modo univoco la metrica. |
| displayName | Facoltativo, ma consigliato. Il testo visualizzato per identificare la metrica nella scheda Quote della pagina Endpoint > Servizi nella consoleGoogle Cloud . Questo testo viene visualizzato anche dai consumer della tua API nelle pagine Quote in IAM e amministrazione e API e servizi. Il nome visualizzato deve contenere al massimo 40 caratteri. Per motivi di leggibilità, l'unità del limite della quota associata viene aggiunta automaticamente al nome visualizzato nella consoleGoogle Cloud . Ad esempio, se specifichi "Read requests" (Richieste di lettura) per il nome visualizzato, nella consoleGoogle Cloud viene visualizzato "Read requests per minute per project" (Richieste di lettura al minuto per progetto). Se non specificata, la "quota senza etichetta" viene visualizzata ai consumer della tua API nelle pagine Quote nelle sezioni IAM e amministrazione e API e servizi. Per mantenere la coerenza con i nomi visualizzati dei servizi Google elencati nella pagina Quote che vedono i consumatori della tua API, ti consigliamo quanto segue per il nome visualizzato:
|
| valueType | Obbligatorio. Deve essere INT64 |
| metricKind | Obbligatorio. Deve essere DELTA |
quota
Specifica il limite di quota per una metrica definita nella sezione quota. Ad esempio:
quota:
limits:
- name: read-requests-limit
metric: read-requests
unit: 1/min/{project}
values:
STANDARD: 5000
Il campo quota.limits contiene un elenco con le seguenti coppie chiave-valore:
| Elemento | Descrizione |
|---|---|
| nome | Obbligatorio. Nome del limite, che deve essere univoco all'interno del servizio. Il nome può contenere lettere maiuscole e minuscole, numeri e "-" (il carattere trattino) e deve avere una lunghezza massima di 64 caratteri. |
| metrica | Obbligatorio. Il nome della metrica a cui si applica questo limite. Questo nome deve corrispondere al testo specificato nel nome di una metrica. Se il testo specificato non corrisponde a un nome di metrica, viene visualizzato un errore quando implementi il documento OpenAPI. |
| unità | Obbligatorio. L'unità del limite. È supportato solo "1/min/{project}", il che significa che il limite viene applicato per progetto e l'utilizzo viene reimpostato ogni minuto. |
| valori | Obbligatorio. Il limite per la metrica. Devi specificarlo come coppia chiave:valore
nel seguente formato: STANDARD: YOUR-LIMIT-FOR-THE-METRIC YOUR-LIMIT-FOR-THE-METRIC con un valore
intero che corrisponde al numero massimo di richieste consentite per l'unità specificata
(solo al minuto, per progetto). Ad esempio:values: STANDARD: 5000 |
x-google-quota
L'estensione x-google-quota viene utilizzata nella sezione OpenAPI paths per associare un metodo nella tua API a una metrica. I metodi che non hanno
x-google-quota definito non hanno limiti di quota applicati. Ad esempio:
x-google-quota:
metricCosts:
read-requests: 1
L'estensione x-google-quota contiene il seguente elemento:
| Elemento | Descrizione |
|---|---|
| metricCosts | Una coppia chiave:valore definita dall'utente: "YOUR-METRIC-NAME": METRIC-COST.
|
Esempi di quote
L'esempio seguente mostra l'aggiunta di una metrica e di un limite per le richieste di lettura e scrittura.
x-google-management:
metrics:
# Define a metric for read requests.
- name: "read-requests"
displayName: "Read requests"
valueType: INT64
metricKind: DELTA
# Define a metric for write requests.
- name: "write-requests"
displayName: "Write requests"
valueType: INT64
metricKind: DELTA
quota:
limits:
# Rate limit for read requests.
- name: "read-requests-limit"
metric: "read-requests"
unit: "1/min/{project}"
values:
STANDARD: 5000
# Rate limit for write requests.
- name: "write-request-limit"
metric: "write-requests"
unit: "1/min/{project}"
values:
STANDARD: 5000
paths:
"/echo":
post:
description: "Echo back a given message."
operationId: "echo"
produces:
- "application/json"
responses:
200:
description: "Echo"
schema:
$ref: "#/definitions/echoMessage"
parameters:
- description: "Message to echo"
in: body
name: message
required: true
schema:
$ref: "#/definitions/echoMessage"
x-google-quota:
metricCosts:
read-requests: 1
security:
- api_key: []
x-google-api-name
Se il servizio contiene una sola API, il nome dell'API è uguale al nome del servizio API Gateway. (API Gateway utilizza il nome
che specifichi nel campo host del documento OpenAPI come nome del
servizio.) Se il tuo servizio contiene più di un'API, specifica i nomi delle API aggiungendo l'estensione x-google-api-name al documento OpenAPI. L'estensione
x-google-api-name consente di denominare esplicitamente le singole API e
stabilire un controllo delle versioni indipendente per ciascuna API.
Ad esempio, puoi configurare un servizio denominato api.example.com con due API,
producer e consumer, con i frammenti di documento OpenAPI mostrati qui:
API Producer in
producer.yaml:swagger: 2.0 host: api.example.com x-google-api-name: producer info: version: 1.0.3
API consumer in
consumer.yaml:swagger: 2.0 host: api.example.com x-google-api-name: consumer info: version: 1.1.0
Puoi eseguire il deployment dei due documenti OpenAPI con:
gcloud api-gateway api-configs create API_CONFIG_ID \ --api=my-api \ --openapi-spec="producer.yaml,consumer.yaml" \ --project=my-project-id