Pubblicato il 02/12/2023 da alnao nella categoria AWS

Il servizio API-Gateway di AWS è stato studiato per permettere ai customer di non doversi preoccupare del processo di autenticazione e autorizzazione: il servizio è studiato per gestire l’accesso alle API esposte, questa tecnica è utile per implementare sistemi di autorizzazioni personalizzate che usano tecnologie come token di connessione OAuth o SAML o che utilizza parametri di richiesta per determinare l’identità del chiamante.

Esistono tre tipi di sistemi di autenticazione

  • IAM Permission: l’accesso alle risorse viene regolato da una policy IAM che gestisce l’autenticazione con la tecnologia “sign v4”, con questo è possibile gestire limitazioni tramite IP, VPC o altro
  • Cognito user pool: l’integrazione permette la gestione di una lista di utenti, la lunghezza di vita di un token e non necessità implementazioni ulteriori, l’autorizzazione può essere a livello di metodo
  • Lambda authorizer: si bassa sul concetto di token-bearer come JWT o Oauth  e permette di invocare una funzione lambda che regola l’accesso alla risorse tramite una IAM policy ritornata dalla funzione stessa

Questo articolo vuole descrivere il terzo caso: quando un client effettua una richiesta a uno dei metodi di una API, il servizio API Gateway effettua una chiamata ad una Lambda per verificare l’identità e il livello di autorizzazione e, in base alla policy IAM ritornata dalla lambda, il Gateway permette o meno l’esecuzione del backend della API.

Esistono due tipi di validazioni implementabili con questa tecnica:

  • token che verifica l’identità grazie ad un bearer token (come JWT o OAuth)
  • request che verifica l’identità usando una combinazione dei dati in request come l’header, la query string e le variabili d’ambiente (per i WebSocket si può usare solo questa seconda tecnica)

Vista la delicatezza e l’importanza del tema, la configurazione non è banale e si rimanda alla documentazione ufficiale per tutti i dettagli.


Con CloudFormation è possibile creare una API con questo tipo sistema di autenticazione usando il tipo serverless API che aggiunge una seziona dedicata di Auth dove si possono definire una lista di sistemi di autenticazione, il tipo e la lambda corrispondete

ApiGateway:
  Type: AWS::Serverless::Api
  Properties:
    StageName: !Ref Stage
    OpenApiVersion: 3.0.2
    CacheClusterEnabled: false
    CacheClusterSize: '0.5'
    MethodSettings:
      - ResourcePath: /
        HttpMethod: GET
        CachingEnabled: false
        CacheTtlInSeconds: 300
    Auth:
      DefaultAuthorizer: MyLambdaRequestAuthorizer
      AddApiKeyRequiredToCorsPreflight : false
      AddDefaultAuthorizerToCorsPreflight: false
      Authorizers:
        MyLambdaRequestAuthorizer:
          FunctionPayloadType: REQUEST
          FunctionArn: !GetAtt LambdaAuthorizer.Arn
          Identity:
            Headers:
              - Authorization

L’esempio completo e funzionante può essere trovato al solito repository:

https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio12lambdaAuthorizer

Un esempio di sistema di autenticazione di questo tipo integrato con il servizio Cognito, può essere trovato in questo tutorial e, in futuro, sarà realizzato anche su questo sito in un articolo dedicato al servizio Cognito.

MENU