Come posso creare e configurare sistemi di autorizzazione Lambda in Gateway API per l'autenticazione e il passaggio di dati?
Desidero passare dati tra Gateway Amazon API, sistemi di autorizzazione AWS Lambda e servizi di backend. Inoltre, desidero gestire le limitazioni di accesso ai dati delle richieste nei sistemi di autorizzazione.
Risoluzione
Nota: assicurati di attivare i log di esecuzione in Amazon CloudWatch con tracciamento dei dati. Inoltre, distribuisci l'API dopo aver modificato i modelli di integrazione o di mappatura.
Crea un sistema di autorizzazione Lambda in Gateway API
Prerequisito: crea una funzione Lambda. Per le istruzioni su Python, consulta Compilazione di funzioni Lambda con Python. Per le istruzioni su Node.js, consulta Compilazione di funzioni Lambda con Node.js.
Crea un sistema di autorizzazione Lambda REQUEST. Per Tipo di origine identità, assicurati che venga mantenuta l'impostazione Intestazione. In Chiave, inserisci un nome per la chiave, ad esempio Authorizationtoken.
Configura il sistema di autorizzazione Lambda e accedi al corpo della richiesta
I sistemi di autorizzazione delle richieste possono accedere solo alle intestazioni, ai parametri di query, alle variabili di fase e alle variabili di contesto. In Gateway API, i dati del corpo della richiesta non vengono trasmessi alle funzioni del sistema di autorizzazione. Per accedere al corpo della richiesta, configura il sistema di autorizzazione Lambda e utilizza le intestazioni HTTP o i parametri della stringa di query per inviare i dati richiesti per l'autorizzazione.
Completa i seguenti passaggi:
-
Apri la console Gateway API.
-
Seleziona l'API, quindi scegli la risorsa.
-
In Metodi, seleziona il metodo, quindi configura il sistema di autorizzazione Lambda.<br id=hardline_break/> Nota: quando configuri il sistema di autorizzazione, i nomi delle intestazioni devono essere in minuscolo.
-
Esempio di codice per un sistema di autorizzazione Lambda:
exports.handler = async (event) => { console.log('Authorizer event:', JSON.stringify(event, null, 2)); const headers = event.headers || {}; const queryParams = event.queryStringParameters || {}; const requestContext = event.requestContext || {}; evaluation_logic_returned_policy return { principalId: 'user', policyDocument: { Version: '2012-10-17', Statement: [{ Action: 'execute-api:Invoke', Effect: 'Allow', Resource: event.methodArn }] }, context: { userId: '123', headerData: headers['validation-data-via-header'] || 'no-header-data', queryData: queryParams.validationData || 'no-query-data', contextresourcePath: requestContext.resourcePath || 'no-context-resource-path' } }; };Nota: l'esempio di codice mostra un sistema di autorizzazione che ha accesso ai dati del client inviati tramite le intestazioni e i parametri di query. Il sistema di autorizzazione utilizza i dati del client per valutare l'autorizzazione di accesso. Inoltre, l'esempio di codice consente tutte le richieste. Per restituire una policy diversa, sostituisci evaluation_logic_returned_policy con la tua logica di valutazione.
-
Esegui questo comando per inviare informazioni all'API e verificare l'accesso del sistema di autorizzazione.
curl -i -X POST "https://api-id.execute-api.region.amazonaws.com/stage_name/resource_path?validationData=test-query-value" \ -H "Authorizationtoken: allow" -H "Validation-Data-Via-Header: test-header-value" \ -H "Content-Type: application/json" \ --data '{"test":"data"}'Nota: sostituisci api-id con l'ID della tua API, region con la tua Regione AWS, stage_name con il nome della fase della tua API e resource_path con il percorso della tua API. Inoltre, se hai inserito un nome diverso per la chiave, sostituisci Authorizationtoken con il nome della tua chiave.
-
Controlla i log della funzione Lambda o di Gateway API per verificare che il sistema di autorizzazione abbia accesso.
Per ulteriori informazioni, consulta Output da un sistema di autorizzazione Lambda di Gateway API.
Utilizza un'integrazione Lambda o HTTP per accedere al contesto nei servizi di backend
Quando il sistema di autorizzazione restituisce informazioni di contesto, potresti non avere accesso a tali informazioni nei servizi di backend. In tal caso, devi utilizzare un'integrazione Lambda o HTTP come backend.
Utilizza una funzione Lambda con un'integrazione proxy
Se utilizzi una funzione Lambda con un'integrazione proxy, l'evento che riceve la funzione Lambda aggiunge automaticamente i dati di contesto.
Esempio di evento:
{ "httpMethod": "POST", "headers": { ... }, ... "requestContext": { "resourceId": "o8nevr", "authorizer": { "principalId": "user", "integrationLatency": 348, }, ... }, "body": "{\"test\":\"data\"}", ... }
Utilizza una funzione Lambda con un'integrazione non proxy
Se utilizzi una funzione Lambda con un'integrazione non proxy, devi utilizzare un modello di mappatura. Il modello di mappatura include le informazioni di contesto nel payload inviato alla funzione Lambda.
Per utilizzare un modello di mappatura, completa i seguenti passaggi:
-
Apri la console Gateway API.
-
Seleziona l'API, quindi scegli la risorsa.
-
Per Metodi, scegli il metodo, quindi seleziona Richiesta di integrazione.
-
In Modelli di mappatura, aggiungi content-type: application/json, quindi inserisci il seguente modello:
{ "body": $input.json('$'), "authorizer-context": { "context-key": "$context.authorizer.context-key" } }Nota: sostituisci context-key con il nome che desideri per la tua chiave di contesto.
Utilizza un'integrazione HTTP con un'integrazione proxy
Se utilizzi un'integrazione proxy, devi utilizzare le intestazioni o i parametri della stringa di query nella richiesta di integrazione per includere le informazioni di contesto.
Completa i seguenti passaggi:
- Apri la console Gateway API.
- Seleziona l'API, quindi scegli la risorsa.
- Per Metodi, scegli il metodo.
- Seleziona Richiesta di integrazione, quindi scegli Modifica.
- Espandi Parametri della stringa di query URL, quindi seleziona Aggiungi parametro della stringa di query.
- In Nome, inserisci header-with-context-information.
- In Mappato da, inserisci context.authorizer.context-key.<br id=hardline_break/> Nota: sostituisci context-key con il nome della tua chiave di contesto.
- Scegli Salva.
Il backend HTTP aggiunge le informazioni di contesto alle intestazioni o ai parametri della stringa di query in base alla sezione a cui hai aggiunto le informazioni di contesto nell'integrazione.
Utilizza un'integrazione HTTP con un'integrazione non proxy
Se utilizzi un'integrazione non proxy, devi aggiungere i parametri di un'intestazione o di una stringa di query. Oppure utilizza un modello di mappatura. Per istruzioni sull'aggiunta di parametri di un'intestazione o di una stringa di query, consulta la sezione Configura il sistema di autorizzazione Lambda e accedi al corpo della richiesta in questo articolo. Per istruzioni sull'utilizzo di un modello di mappatura, consulta la sezione Utilizza una funzione Lambda con un'integrazione non proxy in questo articolo.
- Lingua
- Italiano
