Control del acceso a las API HTTP con autorizadores de JWT - Amazon API Gateway

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Control del acceso a las API HTTP con autorizadores de JWT

Puede utilizar JSON Web Tokens (JWT) como parte de los marcos OpenID Connect (OIDC) y OAuth 2.0 para restringir el acceso del cliente a las API.

Si configura un autorizador de JWT para una ruta de la API, API Gateway valida los JWT que los clientes envían con solicitudes de la API. API Gateway permite o deniega las solicitudes en función de la validación del token y, opcionalmente, de los ámbitos del token. Si configura ámbitos para una ruta, el token debe incluir al menos uno de los ámbitos de la ruta.

Puede configurar distintos autorizadores para cada ruta de una API o utilizar el mismo autorizador para varias rutas.

nota

No existe ningún mecanismo estándar para diferenciar los tokens de acceso de JWT de otros tipos de JWT, como los tokens de ID de OpenID Connect. A menos que necesite tokens de ID para la autorización de la API, le recomendamos que configure las rutas para que soliciten los ámbitos de la autorización. También puede configurar los autorizadores de JWT para que soliciten los emisores o los destinatarios que el proveedor de identidades utiliza solo al emitir tokens de acceso de JWT.

Autorización de solicitudes de API con un autorizador JWT

API Gateway utiliza el siguiente flujo de trabajo general para autorizar solicitudes a rutas configuradas para que utilicen un autorizador de JWT.

  1. Comprueba si identitySource contiene un token. identitySource puede incluir solo el token o el token con el prefijo Bearer.

  2. Descodifique el token.

  3. Compruebe el algoritmo y la firma del token tilizando la clave pública obtenida del del emiso jwks_uri. Actualmente, solo se admiten algoritmos basados en RSA. API Gateway puede almacenar en caché la clave pública durante dos horas. Al rotar las claves, se recomienda dejar un período de gracia durante el cual tanto la clave antigua como la nueva sean válidas.

  4. Validar las reclamaciones. API Gateway evalúa las siguientes reclamaciones de token:

    • kid: el token debe tener una reclamación de encabezado que coincida con la clave de jwks_uri que firmó el token.

    • iss: debe coincidir con el issuer configurado para el autorizador.

    • aud o client_id: deben coincidir con una de las entradas de audience configuradas para el autorizador. API Gateway client_id solo se valida si no aud está presente. Cuando ambos aud y client_id están presentes, API Gateway realiza la evaluación. aud

    • exp – debe ser posterior a la hora actual en UTC.

    • nbf – debe ser anterior a la hora actual en UTC.

    • iat – debe ser anterior a la hora actual en UTC.

    • scope o scp: el token debe incluir al menos uno de los ámbitos de los authorizationScopes de la ruta.

Si falla alguno de estos pasos, API Gateway deniega la solicitud de la API.

Después de validar el JWT, API Gateway transfiere las reclamaciones del token a la integración de la ruta de la API. Los recursos de backend, como las funciones de Lambda, pueden acceder a las reclamaciones de JWT. Por ejemplo, si el JWT incluye una reclamación de identidad emailID, esta estará disponible para una integración de Lambda en $event.requestContext.authorizer.jwt.claims.emailID. Para obtener más información acerca de la carga que API Gateway envía a las integraciones de Lambda, consulte Uso de integraciones de proxy de AWS Lambda para API HTTP.

Crear un autorizador de JWT

Antes de crear un autorizador de JWT, debe registrar una aplicación cliente con un proveedor de identidad. También debe haber creado una API HTTP. Para obtener ejemplos de creación de una API HTTP, consulte Creación de una API HTTP.

Cree un autorizador JWT mediante la consola

Los siguientes pasos muestran cómo crear un autorizador JWT mediante la consola.

Para crear un autorizador JWT mediante la consola
  1. Inicie sesión en la consola de API Gateway en https://console.aws.amazon.com/apigateway.

  2. Elija una API HTTP.

  3. En el panel de navegación principal, elija Autorización.

  4. Seleccione la pestaña Administrar autorizadores.

  5. Seleccione Crear.

  6. Para el tipo de autorizador, elija JWT.

  7. Configure su autorizador JWT y especifique una fuente de identidad que defina la fuente del token.

  8. Seleccione Crear.

Cree un autorizador JWT mediante el AWS CLI

El siguiente AWS CLI comando crea un autorizador JWT. Para jwt-configuration, especifique Audience y Issuer para el proveedor de identidades. Si utiliza Amazon Cognito como proveedor de identidad, lo es. IssuerUrl https://cognito-idp.us-east-2.amazonaws.com/userPoolID

aws apigatewayv2 create-authorizer \ --name authorizer-name \ --api-id api-id \ --authorizer-type JWT \ --identity-source '$request.header.Authorization' \ --jwt-configuration Audience=audience,Issuer=IssuerUrl
Cree un autorizador JWT mediante AWS CloudFormation

La siguiente AWS CloudFormation plantilla crea una API HTTP con un autorizador JWT que utiliza Amazon Cognito como proveedor de identidades.

El resultado de la AWS CloudFormation plantilla es una URL de una interfaz de usuario alojada en Amazon Cognito en la que los clientes pueden registrarse e iniciar sesión para recibir un JWT. Cuando un cliente inicia sesión, se le redirige a su API HTTP con un token de acceso en la URL. Para invocar la API con el token de acceso, cambia # la URL por ? a para usar el token como parámetro de cadena de consulta.

AWSTemplateFormatVersion: '2010-09-09' Description: | Example HTTP API with a JWT authorizer. This template includes an Amazon Cognito user pool as the issuer for the JWT authorizer and an Amazon Cognito app client as the audience for the authorizer. The outputs include a URL for an Amazon Cognito hosted UI where clients can sign up and sign in to receive a JWT. After a client signs in, the client is redirected to your HTTP API with an access token in the URL. To invoke the API with the access token, change the '#' in the URL to a '?' to use the token as a query string parameter. Resources: MyAPI: Type: AWS::ApiGatewayV2::Api Properties: Description: Example HTTP API Name: api-with-auth ProtocolType: HTTP Target: !GetAtt MyLambdaFunction.Arn DefaultRouteOverrides: Type: AWS::ApiGatewayV2::ApiGatewayManagedOverrides Properties: ApiId: !Ref MyAPI Route: AuthorizationType: JWT AuthorizerId: !Ref JWTAuthorizer JWTAuthorizer: Type: AWS::ApiGatewayV2::Authorizer Properties: ApiId: !Ref MyAPI AuthorizerType: JWT IdentitySource: - '$request.querystring.access_token' JwtConfiguration: Audience: - !Ref AppClient Issuer: !Sub https://cognito-idp.${AWS::Region}.amazonaws.com/${UserPool} Name: test-jwt-authorizer MyLambdaFunction: Type: AWS::Lambda::Function Properties: Runtime: nodejs18.x Role: !GetAtt FunctionExecutionRole.Arn Handler: index.handler Code: ZipFile: | exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from the ' + event.routeKey + ' route!'), }; return response; }; APIInvokeLambdaPermission: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref MyLambdaFunction Action: lambda:InvokeFunction Principal: apigateway.amazonaws.com SourceArn: !Sub arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${MyAPI}/$default/$default FunctionExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole UserPool: Type: AWS::Cognito::UserPool Properties: UserPoolName: http-api-user-pool AutoVerifiedAttributes: - email Schema: - Name: name AttributeDataType: String Mutable: true Required: true - Name: email AttributeDataType: String Mutable: false Required: true AppClient: Type: AWS::Cognito::UserPoolClient Properties: AllowedOAuthFlows: - implicit AllowedOAuthScopes: - aws.cognito.signin.user.admin - email - openid - profile AllowedOAuthFlowsUserPoolClient: true ClientName: api-app-client CallbackURLs: - !Sub https://${MyAPI}.execute-api.${AWS::Region}.amazonaws.com ExplicitAuthFlows: - ALLOW_USER_PASSWORD_AUTH - ALLOW_REFRESH_TOKEN_AUTH UserPoolId: !Ref UserPool SupportedIdentityProviders: - COGNITO HostedUI: Type: AWS::Cognito::UserPoolDomain Properties: Domain: !Join - '-' - - !Ref MyAPI - !Ref AppClient UserPoolId: !Ref UserPool Outputs: SignupURL: Value: !Sub https://${HostedUI}.auth.${AWS::Region}.amazoncognito.com/login?client_id=${AppClient}&response_type=token&scope=email+profile&redirect_uri=https://${MyAPI}.execute-api.${AWS::Region}.amazonaws.com

Actualice una ruta para usar un autorizador JWT

Puedes usar la consola AWS CLI, el o un AWS SDK para actualizar una ruta y usar un autorizador JWT.

Actualice una ruta para usar un autorizador JWT mediante la consola

Los siguientes pasos muestran cómo actualizar una ruta para usar el autorizador JWT mediante la consola.

Para crear un autorizador JWT mediante la consola
  1. Inicie sesión en la consola de API Gateway en https://console.aws.amazon.com/apigateway.

  2. Elija una API HTTP.

  3. En el panel de navegación principal, elija Autorización.

  4. Elija un método y, a continuación, seleccione su autorizador en el menú desplegable y elija Adjuntar autorizador.

Actualice una ruta para usar un autorizador JWT mediante el AWS CLI

El siguiente comando actualiza una ruta para usar un autorizador JWT mediante el. AWS CLI

aws apigatewayv2 update-route \ --api-id api-id \ --route-id route-id \ --authorization-type JWT \ --authorizer-id authorizer-id \ --authorization-scopes user.email