Controllo degli accessi alle API HTTP con sistemi di autorizzazione AWS Lambda
Si sfrutta un'autorizzazione Lambda al fine di utilizzare una funzione Lambda per controllare l'accesso all'API HTTP. Quindi, quando un client invoca un'API, API Gateway richiama la funzione Lambda. API Gateway utilizza la risposta dalla funzione Lambda per determinare se il client può accedere all'API.
Tipo di formato payload
Il tipo di formato del payload dell'autorizzazione specifica il formato dei dati che API Gateway invia a un'autorizzazione Lambda e il modo in cui API Gateway interpreta la risposta ricevuta da Lambda. Se non si specifica un tipo di formato payload, AWS Management Console utilizza la versione più recente per impostazione predefinita. Se si crea un autorizzatore Lambda mediante la AWS CLI, AWS CloudFormation o un SDK, è necessario specificare authorizerPayloadFormatVersion. I valori supportati sono 1.0 e 2.0.
Se è necessario garantire la compatibilità con le API REST, utilizzare la versione 1.0.
Gli esempi seguenti mostrano la struttura di ogni tipo di formato payload.
Formato della risposta dell'autorizzazione
Il tipo di formato del payload determina anche la struttura della risposta che deve essere restituita dalla funzione Lambda.
Risposta della funzione Lambda per il formato 1.0
Se si sceglie il tipo di formato 1.0, le autorizzazioni Lambda devono restituire una policy IAM che consenta o rifiuti l'accesso alla route dell'API. Nella policy è possibile utilizzare la sintassi standard delle policy IAM. Per alcuni esempi di policy IAM, consultare Controllo degli accessi per invocare un'API. È possibile passare le proprietà del contesto alle integrazioni Lambda o ai log di accesso utilizzando $context.authorizer.. L'oggetto propertycontext è facoltativo e claims è un segnaposto riservato che non può essere utilizzato come oggetto contesto. Per ulteriori informazioni, consulta Personalizzazione dei log degli accessi delle API HTTP.
Risposta della funzione Lambda per il formato 2.0
Se si sceglie il tipo di formato 2.0, dalla funzione Lambda è possibile restituire un valore booleano o una policy IAM che utilizza la sintassi standard della policy di IAM. Per restituire un valore booleano, abilitare risposte semplici per l'autorizzazione. Negli esempi seguenti viene illustrato il formato in cui è necessario codificare il risultato restituito dalla funzione Lambda. L'oggetto context è facoltativo. È possibile passare le proprietà del contesto alle integrazioni Lambda o ai log di accesso utilizzando $context.authorizer.. Per ulteriori informazioni, consulta Personalizzazione dei log degli accessi delle API HTTP.property
Esempio di funzioni di autorizzazione Lambda
Le seguenti funzioni Lambda Node.js di esempio illustrano i formati di risposta richiesti che è necessario restituire dalla funzione Lambda per il tipo di formato del payload 2.0.
Origini di identità
È facoltativamente possibile specificare le origini di identità per un'autorizzazione Lambda. Le origini di identità specificano la posizione dei dati necessari per autorizzare una richiesta. Ad esempio, è possibile specificare i valori di intestazione o di stringa di query come origini di identità. Se si specificano le origini di identità, i client devono includerle nella richiesta. Se la richiesta del client non include le origini di identità, API Gateway non richiama l'autorizzazione Lambda e il client riceve un errore 401.
La tabella seguente illustra le origini di identità supportate per un sistema di autorizzazione Lambda.
Tipo |
Esempio |
Note |
|---|---|---|
| Valore intestazione | $request.header.name |
I nomi delle intestazioni non fanno distinzione tra maiuscole e minuscole. |
| Valore della stringa di query | $request.querystring.name |
I nomi delle stringhe di query fanno distinzione tra maiuscole e minuscole. |
| Variabile di contesto | $context.variableName |
Valore di una variabile di contesto supportata. |
| Variabile di fase | $stageVariables.variableName |
Il valore di una variabile di fase. |
È anche possibile ottenere direttamente {"errorMessage" : "Unauthorized"} dalla funzione Lambda per restituire un errore 401 ai client. Se si restituisce direttamente ai client un errore 401 della funzione Lambda, non specificare alcuna origine di identità quando si crea il sistema di autorizzazione Lambda.
Caching delle risposte delle autorizzazioni
È possibile abilitare il caching per un'autorizzazione Lambda specificando un authorizerResultTtlInSeconds. Quando il caching è abilitato per un'autorizzazione, API Gateway utilizza le origini di identità dell'autorizzazione come chiave della cache. Se un client specifica gli stessi parametri nelle origini di identità all'interno del TTL configurato, API Gateway utilizza il risultato dell'autorizzazione memorizzato nella cache, anziché richiamare la funzione Lambda.
Per abilitare il caching, l'autorizzazione deve disporre di almeno un'origine di identità.
Se si abilitano risposte semplici per un'autorizzazione, la risposta dell'autorizzazione consente o rifiuta completamente tutte le richieste API che corrispondono ai valori dell'origine di identità memorizzata nella cache. Per autorizzazioni più granulari, disabilitare le risposte semplici e restituire una policy IAM. A seconda del sistema di autorizzazione, la policy IAM potrebbe dover controllare l’accesso a più utenti.
Per impostazione predefinita, API Gateway utilizza la risposta dell'autorizzazione memorizzata nella cache per tutte le route dell'API che utilizzano l'autorizzazione. Per inserire nella cache le risposte per l'instradamento, aggiungere $context.routeKey alle origini di identità dell'autorizzazione.
Creare un'autorizzazione Lambda
Quando si crea un'autorizzazione Lambda, si specifica la funzione Lambda che API Gateway deve utilizzare. È necessario concedere ad API Gateway l'autorizzazione per richiamare la funzione Lambda utilizzando la policy basata su risorse della funzione o un ruolo IAM. Il comando create-authorizer seguente crea un sistema di autorizzazione Lambda:
aws apigatewayv2 create-authorizer \ --api-idabcdef123\ --authorizer-type REQUEST \ --identity-source '$request.header.Authorization' \ --name lambda-authorizer \ --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:my-function/invocations' \ --authorizer-payload-format-version '2.0' \ --enable-simple-responses
Il comando add-permission seguente aggiorna la policy di risorse della funzione Lambda per fornire a Gateway API l’autorizzazione per invocare la funzione. Se l'API Gateway non dispone dell'autorizzazione a richiamare la funzione, i client ricevono un errore 500 Internal Server Error.
aws lambda add-permission \ --function-namemy-authorizer-function\ --statement-id apigateway-invoke-permissions-abc123 \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/authorizers/authorizer-id"
Dopo aver creato un'autorizzazione e concesso ad API Gateway l'autorizzazione per richiamarla, aggiornare la route affinché utilizzi l'autorizzazione. Il comando update-route seguente aggiunge il sistema di autorizzazione Lambda all’instradamento. Se il sistema di autorizzazione Lambda utilizza il caching delle policy, è necessario aggiornare la policy per controllare l’accesso all’instradamento aggiuntivo.
aws apigatewayv2 update-route \ --api-idabcdef123\ --route-idabc123\ --authorization-type CUSTOM \ --authorizer-iddef123
Risoluzione dei problemi relativi alle autorizzazioni Lambda
Se l'API Gateway non è in grado di richiamare l'autorizzazione Lambda o l'autorizzazione Lambda restituisce una risposta in un formato non valido, i client ricevono una risposta 500 Internal Server
Error.
Per risolvere gli errori, abilitare la registrazione degli accessi per la fase dell'API. Includere la variabile di registrazione $context.authorizer.error nel formato di log.
Se i log indicano che API Gateway non dispone dell'autorizzazione per richiamare la funzione, aggiornare la policy basata su risorse della funzione o fornire un ruolo IAM per concedere ad API Gateway il permesso di per richiamare l'autorizzazione.
Se i log indicano che la funzione Lambda restituisce una risposta non valida, verificare che la funzione Lambda restituisca una risposta nel formato richiesto.