

# Usar os autorizadores do API Gateway Lambda
<a name="apigateway-use-lambda-authorizer"></a>

Use um *autorizador do Lambda* (anteriormente conhecido como *autorizador personalizado*) para controlar o acesso à API. Quando um cliente solicita o método da API, o API Gateway chama o autorizador do Lambda. O autorizador do Lambda usa a identidade do chamador como entrada e retorna uma política do IAM como saída.

Use um autorizador do Lambda para implementar um esquema de autorização personalizado. O esquema pode usar parâmetros de solicitação para determinar a identidade do chamador ou usar uma estratégia de autenticação de token de portador, como OAuth ou SAML. Crie um autorizador do Lambda no console da API REST do API Gateway, usando a AWS CLI ou um SDK da AWS.

## Fluxo de trabalho de autorização do autorizador do Lambda
<a name="api-gateway-lambda-authorizer-flow"></a>

O diagrama a seguir mostra o fluxo de trabalho de autorização referente a um autorizador do Lambda.

![\[Fluxo de trabalho de autorização do Lambda do API Gateway\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/custom-auth-workflow.png)


**Fluxo de trabalho de autorização do Lambda do API Gateway**

1. O cliente chama um método em uma API do API Gateway, passando um token de portador ou parâmetros de solicitação.

1. O API Gateway confere se a solicitação do método está configurada com um autorizador do Lambda. Se estiver, o API Gateway chama a função do Lambda.

1. A função do Lambda autentica o chamador. A função pode fazer a autenticação das seguintes maneiras:
   + Chamando um provedor OAuth para receber um token de acesso OAuth.
   + Chamando um provedor SAML para receber uma declaração SAML.
   + Gerando uma política do IAM com base nos valores do parâmetro de solicitação.
   + Recuperando as credenciais de um banco de dados.

1. A função do Lambda retorna uma política do IAM e um identificador de entidade principal. Se a função do Lambda não retornar essas informações, a chamada falhará. 

1. O API Gateway avalia a política do IAM.
   + Se o acesso for negado, o API Gateway retornará um código de status HTTP, por exemplo, `403 ACCESS_DENIED`.
   + Se o acesso for permitido, o API Gateway invocará o método. 

     Se você habilitar o armazenamento em cache da autorização, o API Gateway armazenará a política em cache para que a função do autorizador do Lamba não seja invocada novamente. Sua política deve ser aplicável a todos os recursos e métodos em sua API.

É possível personalizar as respostas `403 ACCESS_DENIED` ou `401 UNAUTHORIZED` do gateway. Para saber mais, consulte [Respostas do gateway para APIs REST no API Gateway](api-gateway-gatewayResponse-definition.md).

## Como escolher um tipo de autorizador do Lambda
<a name="api-gateway-lambda-authorizer-choose"></a>

Existem dois tipos de autorizadores do Lambda:

**Solicitar um autorizador do Lambda baseado em parâmetros (autorizador `REQUEST`)**  
Um autorizador `REQUEST` recebe a identidade do chamador em uma combinação de cabeçalhos, parâmetros de strings de consulta, [`stageVariables`](api-gateway-mapping-template-reference.md#stagevariables-template-reference) e variáveis [`$context`](api-gateway-mapping-template-reference.md#context-variable-reference). É possível usar um autorizador `REQUEST` para criar políticas refinadas com base nas informações de várias fontes de identidade, como as variáveis de contexto `$context.path` e `$context.httpMethod`.  
Se você ativar o armazenamento em cache de autorização para um autorizador `REQUEST`, o API Gateway verificará se todas as fontes de identidade especificadas estão presentes na solicitação. Se uma fonte de identidade especificada estiver ausente, for nula ou estiver vazia, o API Gateway retornará uma resposta HTTP `401 Unauthorized` sem chamar a função do autorizador do Lambda. Quando há várias fontes de identidade definidas, todas são usadas para derivar a chave de cache do autorizador, preservando a ordem. É possível definir uma chave de cache refinada usando várias fontes de identidade.  
Se você alterar qualquer parte da chave do cache e reimplantar a API, o autorizador descartará o documento da política em cache e gerará outro.  
Se você desativar o armazenamento em cache de autorização para um autorizador `REQUEST`, o API Gateway passará a solicitação diretamente à função do Lambda. 

**Autorizador do Lambda com base em token (autorizador `TOKEN`)**  
Um autorizador `TOKEN` recebe a identidade do chamador em um token de portador, como um JSON Web Token (JWT) ou um token OAuth.  
Se você ativar o armazenamento em cache de autorização para um autorizador `TOKEN`, o nome do cabeçalho especificado na origem do token será a chave do cache.   
Além disso, é possível usar a validação de token para inserir uma instrução RegEx. O API Gateway executa a validação inicial do token de entrada em relação a essa expressão e invoca a função do autorizador do Lambda mediante a validação com êxito. Isso ajuda a reduzir as chamadas para a API.   
A propriedade `IdentityValidationExpression` é compatível somente com autorizadores `TOKEN`. Para obter mais informações, consulte [Objeto x-amazon-apigateway-authorizer](api-gateway-swagger-extensions-authorizer.md).

**nota**  
Recomendamos que você use um autorizador `REQUEST` para controlar o acesso à API. É possível controlar o acesso à API com base em várias fontes de identidade ao usar um autorizador `REQUEST`, em comparação com uma única fonte de identidade ao usar um autorizador `TOKEN`. Além disso, você pode separar as chaves de cache usando várias fontes de identidade para um autorizador `REQUEST`.

## Exemplo de função do Lambda do autorizador `REQUEST`
<a name="api-gateway-lambda-authorizer-request-lambda-function-create"></a>

O código de exemplo a seguir criará uma função do autorizador do Lambda que permite uma solicitação se o cabeçalho `HeaderAuth1`, o parâmetro de consulta `QueryString1` e a variável de estágio de `StageVar1` fornecidos pelo cliente corresponderem aos valores especificados de `headerValue1`, `queryValue1` e `stageValue1`, respectivamente. 

------
#### [ Node.js ]

```
// A simple request-based authorizer example to demonstrate how to use request 
// parameters to allow or deny a request. In this example, a request is  
// authorized if the client-supplied HeaderAuth1 header, QueryString1
// query parameter, and stage variable of StageVar1 all match
// specified values of 'headerValue1', 'queryValue1', and 'stageValue1',
// respectively.
    
export const handler = function(event, context, callback) {
    console.log('Received event:', JSON.stringify(event, null, 2));
    
    // Retrieve request parameters from the Lambda function input:
    var headers = event.headers;
    var queryStringParameters = event.queryStringParameters;
    var pathParameters = event.pathParameters;
    var stageVariables = event.stageVariables;
        
    // Parse the input for the parameter values
    var tmp = event.methodArn.split(':');
    var apiGatewayArnTmp = tmp[5].split('/');
    var awsAccountId = tmp[4];
    var region = tmp[3];
    var restApiId = apiGatewayArnTmp[0];
    var stage = apiGatewayArnTmp[1];
    var method = apiGatewayArnTmp[2];
    var resource = '/'; // root resource
    if (apiGatewayArnTmp[3]) {
        resource += apiGatewayArnTmp[3];
    }
        
    // Perform authorization to return the Allow policy for correct parameters and 
    // the 'Unauthorized' error, otherwise.

     
    if (headers.HeaderAuth1 === "headerValue1"
        && queryStringParameters.QueryString1 === "queryValue1"
        && stageVariables.StageVar1 === "stageValue1") {
        callback(null, generateAllow('me', event.methodArn));
    }  else {
        callback(null, generateDeny('me', event.methodArn));
    }
}
     
// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    // Required output:
    var authResponse = {};
    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; // default version
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; // default action
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }
    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}
     
var generateAllow = function(principalId, resource) {
    return generatePolicy(principalId, 'Allow', resource);
}
     
var generateDeny = function(principalId, resource) {
    return generatePolicy(principalId, 'Deny', resource);
}
```

------
#### [ Python ]

```
# A simple request-based authorizer example to demonstrate how to use request
# parameters to allow or deny a request. In this example, a request is
# authorized if the client-supplied headerauth1 header, QueryString1
# query parameter, and stage variable of StageVar1 all match
# specified values of 'headerValue1', 'queryValue1', and 'stageValue1',
# respectively.

def lambda_handler(event, context):
    print(event)

    # Retrieve request parameters from the Lambda function input:
    headers = event['headers']
    queryStringParameters = event['queryStringParameters']
    pathParameters = event['pathParameters']
    stageVariables = event['stageVariables']

    # Parse the input for the parameter values
    tmp = event['methodArn'].split(':')
    apiGatewayArnTmp = tmp[5].split('/')
    awsAccountId = tmp[4]
    region = tmp[3]
    restApiId = apiGatewayArnTmp[0]
    stage = apiGatewayArnTmp[1]
    method = apiGatewayArnTmp[2]
    resource = '/'

    if (apiGatewayArnTmp[3]):
        resource += apiGatewayArnTmp[3]

    # Perform authorization to return the Allow policy for correct parameters
    # and the 'Unauthorized' error, otherwise.

    if (headers['HeaderAuth1'] == "headerValue1" and queryStringParameters['QueryString1'] == "queryValue1" and stageVariables['StageVar1'] == "stageValue1"):
        response = generateAllow('me', event['methodArn'])
        print('authorized')
        return response
    else:
        print('unauthorized')
        response = generateDeny('me', event['methodArn'])
        return response
    # Help function to generate IAM policy


def generatePolicy(principalId, effect, resource):
    authResponse = {}
    authResponse['principalId'] = principalId
    if (effect and resource):
        policyDocument = {}
        policyDocument['Version'] = '2012-10-17'
        policyDocument['Statement'] = []
        statementOne = {}
        statementOne['Action'] = 'execute-api:Invoke'
        statementOne['Effect'] = effect
        statementOne['Resource'] = resource
        policyDocument['Statement'] = [statementOne]
        authResponse['policyDocument'] = policyDocument

    authResponse['context'] = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": True
    }

    return authResponse


def generateAllow(principalId, resource):
    return generatePolicy(principalId, 'Allow', resource)


def generateDeny(principalId, resource):
    return generatePolicy(principalId, 'Deny', resource)
```

------

Neste exemplo, a função do autorizador do Lambda verifica os parâmetros de entrada e age da seguinte forma:
+ Se todos os valores de parâmetro necessários corresponderem aos valores esperados, a função do autorizador retornará uma resposta HTTP `200 OK` e uma política do IAM que é semelhante ao seguinte, e a solicitação de método será bem-sucedida:

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
      }
    ]
  }
  ```

------
+ Caso contrário, a função do autorizador retornará uma resposta HTTP `401 Unauthorized` e ocorrerá uma falha na solicitação do método.

Além de retornar uma política do IAM, a função de autorizador do Lambda também deve retornar o identificador principal do autor da chamada. Opcionalmente, ela pode retornar um objeto `context` com informações adicionais que podem ser passadas ao back-end de integração. Para obter mais informações, consulte [Saída de um autorizador do Lambda para o API Gateway](api-gateway-lambda-authorizer-output.md).

No código de produção, talvez seja necessário autenticar o usuário antes de conceder a autorização. É possível adicionar a lógica de autenticação à função do Lambda chamando um provedor de autenticação conforme indicado na documentação desse provedor.

## Exemplo de função do Lambda do autorizador `TOKEN`
<a name="api-gateway-lambda-authorizer-token-lambda-function-create"></a>

O código de exemplo a seguir cria uma função do Lambda do autorizador `TOKEN` que permite que um chamador invoque um método caso o valor do token fornecido pelo cliente seja `allow`. O chamador não tem permissão para invocar a solicitação caso o valor do token seja `deny`. Se o valor do token for `unauthorized` ou uma string vazia, a função do autorizador retornará uma resposta `401 UNAUTHORIZED`.

------
#### [ Node.js ]

```
// A simple token-based authorizer example to demonstrate how to use an authorization token 
// to allow or deny a request. In this example, the caller named 'user' is allowed to invoke 
// a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke 
// the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
// string, the authorizer function returns an HTTP 401 status code. For any other token value, 
// the authorizer returns an HTTP 500 status code. 
// Note that token values are case-sensitive.

export const handler =  function(event, context, callback) {
    var token = event.authorizationToken;
    switch (token) {
        case 'allow':
            callback(null, generatePolicy('user', 'Allow', event.methodArn));
            break;
        case 'deny':
            callback(null, generatePolicy('user', 'Deny', event.methodArn));
            break;
        case 'unauthorized':
            callback("Unauthorized");   // Return a 401 Unauthorized response
            break;
        default:
            callback("Error: Invalid token"); // Return a 500 Invalid token response
    }
};

// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    var authResponse = {};
    
    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; 
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; 
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }
    
    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}
```

------
#### [ Python ]

```
# A simple token-based authorizer example to demonstrate how to use an authorization token
# to allow or deny a request. In this example, the caller named 'user' is allowed to invoke
# a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke
# the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
# string, the authorizer function returns an HTTP 401 status code. For any other token value,
# the authorizer returns an HTTP 500 status code.
# Note that token values are case-sensitive.

import json


def lambda_handler(event, context):
    token = event['authorizationToken']
    if token == 'allow':
        print('authorized')
        response = generatePolicy('user', 'Allow', event['methodArn'])
    elif token == 'deny':
        print('unauthorized')
        response = generatePolicy('user', 'Deny', event['methodArn'])
    elif token == 'unauthorized':
        print('unauthorized')
        raise Exception('Unauthorized')  # Return a 401 Unauthorized response
        return 'unauthorized'
    try:
        return json.loads(response)
    except BaseException:
        print('unauthorized')
        return 'unauthorized'  # Return a 500 error


def generatePolicy(principalId, effect, resource):
    authResponse = {}
    authResponse['principalId'] = principalId
    if (effect and resource):
        policyDocument = {}
        policyDocument['Version'] = '2012-10-17'
        policyDocument['Statement'] = []
        statementOne = {}
        statementOne['Action'] = 'execute-api:Invoke'
        statementOne['Effect'] = effect
        statementOne['Resource'] = resource
        policyDocument['Statement'] = [statementOne]
        authResponse['policyDocument'] = policyDocument
    authResponse['context'] = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": True
    }
    authResponse_JSON = json.dumps(authResponse)
    return authResponse_JSON
```

------

Neste exemplo, quando a API recebe uma solicitação de método, o API Gateway repassa o token de origem para essa função do autorizador do Lambda no atributo `event.authorizationToken`. A função do autorizador do Lambda lê o token e age da seguinte forma:
+ Se o valor do token for `allow`, a função do autorizador retornará uma resposta HTTP `200 OK` e uma política do IAM que é semelhante ao seguinte, e a solicitação de método será bem-sucedida:

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
      }
    ]
  }
  ```

------
+ Se o valor do token for `deny`, a função do autorizador retornará uma resposta HTTP `200 OK` e uma política do IAM `Deny` que é semelhante ao seguinte, e ocorrerá uma falha na solicitação de método:

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Deny",
        "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
      }
    ]
  }
  ```

------
**nota**  
Fora do ambiente de teste, o API Gateway retorna uma resposta HTTP `403 Forbidden` e ocorre uma falha na solicitação do método.
+ Se o valor do token for `unauthorized`, a função do autorizador retornará uma resposta HTTP `401 Unauthorized`, e ocorrerá uma falha na chamada de método.
+ Se o valor do token for diferente, o cliente receberá uma resposta `500 Invalid token`, e ocorrerá uma falha na chamada de método.

Além de retornar uma política do IAM, a função de autorizador do Lambda também deve retornar o identificador principal do autor da chamada. Opcionalmente, ela pode retornar um objeto `context` com informações adicionais que podem ser passadas ao back-end de integração. Para obter mais informações, consulte [Saída de um autorizador do Lambda para o API Gateway](api-gateway-lambda-authorizer-output.md).

No código de produção, talvez seja necessário autenticar o usuário antes de conceder a autorização. É possível adicionar a lógica de autenticação à função do Lambda chamando um provedor de autenticação conforme indicado na documentação desse provedor.

## Exemplos adicionais de funções do autorizador do Lambda
<a name="api-gateway-lambda-authorizer-lambda-function-create"></a>

A lista a seguir mostra exemplos adicionais de funções do autorizador do Lambda. É possível criar uma função do Lambda na mesma conta em que você criou a API ou em uma conta diferente.

No exemplo anterior de funções do Lambda, é possível usar a função integrada [AWSLambdaBasicExecutionRole](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html), já que essas funções não chamam outros serviços da AWS. Se a função do Lambda chamar outros serviços da AWS, será necessário atribuir um perfil de execução do IAM à função do Lambda. Para criar a função, siga as instruções na [Função de execução AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html).

**Exemplos adicionais de funções do autorizador do Lambda**
+  Para ver um exemplo de aplicação, consulte [Open Banking Brasil: amostras de autorizações](https://github.com/aws-samples/openbanking-brazilian-auth-samples) no GitHub. 
+  Para obter mais exemplos de funções do Lambda, consulte [ aws-apigateway-lambda-authorizer-blueprints](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints) no GitHub. 
+ É possível criar um autorizador do Lambda que autentica usuários usando grupos de usuários do Amazon Cognito e autoriza chamadores com base em um armazenamento de políticas usando o Verified Permissions. Para obter mais informações, consulte [Controlar o acesso com base nos atributos de uma identidade com o Verified Permissions](apigateway-lambda-authorizer-verified-permissions.md).
+ O console do Lambda fornece um esquema Python, que você pode usar ao selecionar **Use a blueprint (Usar um esquema)** e selecionar o esquema **api-gateway-authorizer-python**.

# Configurar um autorizador do Lambda para o API Gateway
<a name="configure-api-gateway-lambda-authorization"></a>

Depois de criar uma função do Lambda, configure-a como um autorizador para a API. Em seguida, configure o método para invocar o autorizador do Lambda e determinar se um chamador pode invocar o método. É possível criar uma função do Lambda na mesma conta em que você criou a API ou em uma conta diferente.

Você pode testar o autorizador do Lambda usando as ferramentas integradas no console do API Gateway ou usando o [Postman](https://www.postman.com/). Consulte instruções sobre como usar o Postman para testar a função do autorizador do Lambda em [Chamar uma API com um autorizador do Lambda do API Gateway](call-api-with-api-gateway-lambda-authorization.md).

## Configurar um autorizador do Lambda (console)
<a name="configure-api-gateway-lambda-authorization-with-console"></a>

 O procedimento a seguir mostra como criar um autorizador do Lambda no console da API REST do API Gateway. Para saber mais sobre os diferentes tipos de autorizador do Lambda, consulte [Como escolher um tipo de autorizador do Lambda](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-choose). 

------
#### [ REQUEST authorizer ]

**Como configurar um autorizador `REQUEST` do Lambda**

1. Faça login no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Escolha uma API e selecione **Autorizadores**. 

1. Selecione **Criar autorizador**. 

1. Em **Nome do autorizador**, insira um nome para o autorizador.

1. Em **Tipo de autorizador**, selecione **Lambda**. 

1. Em **Função do Lambda**, selecione a Região da AWS onde você criou a função do Lambda do autorizador e, depois, insira o nome da função.

1. Mantenha o campo **Função Lambda de invocação** em branco para permitir que o console da API REST do API Gateway defina uma política baseada em recursos. A política concede permissões ao API Gateway para invocar a função do autorizador do Lambda. Você também pode optar por inserir o nome de um perfil do IAM para permitir que o API Gateway invoque a função do autorizador do Lambda. Consulte um exemplo de função em [Criar uma função do IAM que pode ser assumida](integrating-api-with-aws-services-lambda.md#api-as-lambda-proxy-setup-iam-role-policies). 

1. Em **Carga de evento do Lambda**, escolha **Solicitar**.

1. Em **Tipo de origem de identidade**, selecione um tipo de parâmetro. Os tipos de parâmetros com suporte são `Header`, `Query string`, `Stage variable` e `Context`. Para adicionar mais origens de identidade, escolha **Adicionar parâmetro**. 

1. Para armazenar em cache a política de autorização gerada pelo autorizador, mantenha **Armazenamento em cache de autorização** ativado. Quando o armazenamento de políticas em cache está habilitado, é possível modificar o valor de **TTL**. A definição de **TTL** como zero desabilita o armazenamento em cache de políticas.

   Se você habilitar o armazenamento em cache, o autorizador deverá retornar uma política que seja aplicável a todos os métodos em uma API. Para aplicar uma política específica do método, use as variáveis de contexto `$context.path` e `$context.httpMethod`.

1. Selecione **Criar autorizador**.

------
#### [ TOKEN authorizer ]

**Como configurar um autorizador `TOKEN` do Lambda**

1. Faça login no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Escolha uma API e selecione **Autorizadores**. 

1. Selecione **Criar autorizador**. 

1. Em **Nome do autorizador**, insira um nome para o autorizador.

1. Em **Tipo de autorizador**, selecione **Lambda**. 

1. Em **Função do Lambda**, selecione a Região da AWS onde você criou a função do Lambda do autorizador e, depois, insira o nome da função.

1. Mantenha o campo **Função Lambda de invocação** em branco para permitir que o console da API REST do API Gateway defina uma política baseada em recursos. A política concede permissões ao API Gateway para invocar a função do autorizador do Lambda. Você também pode optar por inserir o nome de um perfil do IAM para permitir que o API Gateway invoque a função do autorizador do Lambda. Consulte um exemplo de função em [Criar uma função do IAM que pode ser assumida](integrating-api-with-aws-services-lambda.md#api-as-lambda-proxy-setup-iam-role-policies). 

1. Em **Carga de evento do Lambda**, escolha **Token**.

1. Em **Origem do token**, insira o nome do cabeçalho que contém o token de autorização. O chamador deve incluir um cabeçalho desse nome para enviar o token de autorização ao autorizador do Lambda.

1. (Opcional) Em **Validação do token**, insira uma instrução RegEx. O API Gateway executa a validação inicial do token de entrada em relação a esta expressão e invoca o autorizador mediante a validação com êxito.

1. Para armazenar em cache a política de autorização gerada pelo autorizador, mantenha **Armazenamento em cache de autorização** ativado. Quando o armazenamento em cache de políticas está habilitado, o nome de cabeçalho especificado em **Origem do token** se torna a chave de cache. Quando o armazenamento de políticas em cache está habilitado, é possível modificar o valor de **TTL**. A definição de **TTL** como zero desabilita o armazenamento em cache de políticas. 

   Se você habilitar o armazenamento em cache, o autorizador deverá retornar uma política que seja aplicável a todos os métodos em uma API. Para aplicar uma política específica do método, desative **Armazenamento em cache de autorização**.

1. Selecione **Criar autorizador**.

------

Depois de criar o autorizador do Lambda, é possível testá-lo. O procedimento a seguir mostra como testar o autorizador do Lambda.

------
#### [ REQUEST authorizer ]

**Como testar um autorizador `REQUEST` do Lambda**

1. Faça login no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Selecione o nome do autorizador.

1. Em **Testar autorizador**, insira um valor para a fonte de identidades.

   Se você estiver usando o [Exemplo de função do Lambda do autorizador `REQUEST`](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-request-lambda-function-create), faça o seguinte:

   1. Selecione **Cabeçalho** e insira **headerValue1**; depois, escolha **Adicionar parâmetro**.

   1. Em **Tipo de origem de identidade**, selecione **String de consulta**, insira **queryValue1** e escolha **Adicionar parâmetro**.

   1. Em **Tipo de origem de identidade**, selecione **Variável de estágio** e insira **stageValue1**.

   Você não pode modificar as variáveis de contexto para a invocação do teste, mas pode modificar o modelo de evento de teste do **Autorizador do API Gateway** para a função do Lambda. Em seguida, você pode testar a função de autorizador do Lambda com variáveis de contexto modificadas. Para saber mais, consulte [Testing Lambda functions in the console](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html) no *Guia do desenvolvedor do AWS Lambda*.

1. Escolha **Testar autorizador**.

------
#### [ TOKEN authorizer ]

**Como testar um autorizador `TOKEN` do Lambda**

1. Faça login no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Selecione o nome do autorizador.

1. Em **Testar autorizador**, insira um valor para o token.

   Se você estiver usando o [Exemplo de função do Lambda do autorizador `TOKEN`](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-token-lambda-function-create), faça o seguinte:

   1. Em **authorizationToken**, insira **allow**.

1. Escolha **Testar autorizador**.

    Se o autorizador do Lambda negar com sucesso uma solicitação no ambiente de teste, o teste responderá com uma resposta HTTP `200 OK`. No entanto, fora do ambiente de teste, o API Gateway retorna uma resposta HTTP `403 Forbidden` e ocorre uma falha na solicitação do método.

------

## Configurar um autorizador do Lambda (AWS CLI)
<a name="configure-api-gateway-lambda-authorization-cli"></a>

O comando [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) mostra como criar um autorizador do Lambda usando a AWS CLI.

------
#### [ REQUEST authorizer ]

O comando [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) indicado abaixo cria um autorizador `REQUEST` e usa o cabeçalho `Authorizer` e a variável de contexto `accountId` como fontes de identidade:

```
aws apigateway create-authorizer \
    --rest-api-id 1234123412 \
    --name 'First_Request_Custom_Authorizer' \
    --type REQUEST \
    --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123412341234:function:customAuthFunction/invocations' \
    --identity-source 'method.request.header.Authorization,context.accountId' \
    --authorizer-result-ttl-in-seconds 300
```

------
#### [ TOKEN authorizer ]

O comando [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) indicado abaixo cria um autorizador `TOKEN` e usa o cabeçalho `Authorization` como fonte de identidade:

```
aws apigateway create-authorizer \
    --rest-api-id 1234123412 \
    --name 'First_Token_Custom_Authorizer' \
    --type TOKEN \
    --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123412341234:function:customAuthFunction/invocations' \
    --identity-source 'method.request.header.Authorization' \
    --authorizer-result-ttl-in-seconds 300
```

------

Depois de criar o autorizador do Lambda, é possível testá-lo. O comando [test-invoke-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/test-invoke-authorizer.html) indicado abaixo testa o autorizador do Lambda:

```
aws apigateway test-invoke-authorizer --rest-api-id 1234123412 \
   --authorizer-id efg1234 \
   --headers Authorization='Value'
```

## Configurar um método para usar um autorizador do Lambda (console)
<a name="configure-api-gateway-lambda-authorization-method-console"></a>

Depois de configurar o autorizador do Lambda, anexe-o a um método para a API. Se seu autorizador usa o armazenamento em cache de autorização, atualize a política para controlar o acesso ao método adicional.

**Para configurar um método de API para usar um autorizador do Lambda**

1. Faça login no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Selecione uma API.

1. Selecione **Recursos** e escolha um novo método ou um já existente.

1. Na guia **Solicitação de método**, em **Configurações de solicitação de método**, escolha **Editar**. 

1. Em **Autorizador**, no menu suspenso, selecione o autorizador do Lambda que você acabou de criar. 

1.  (Opcional) Se você quiser passar o token de autorização para o back-end, escolha **Cabeçalhos de solicitação HTTP**. Escolha **Adicionar cabeçalho** e adicione o nome do cabeçalho de autorização. Em **Nome**, insira um nome de cabeçalho que corresponda ao nome de **Origem do token** especificado quando você criou o autorizador do Lambda para a API. Esta etapa não se aplica a autorizadores `REQUEST`. 

1. Escolha **Salvar**.

1. Escolha **Deploy API (Implantar API)** para implantar a API em um estágio. Para um autorizador `REQUEST` que usa variáveis de estágio, você também deve definir as variáveis de estágio necessárias e especificar os respectivos valores enquanto estiver na página **Estágio**.

## Configurar um método para usar um autorizador do Lambda (AWS CLI)
<a name="configure-api-gateway-lambda-authorization-method-cli"></a>

Depois de configurar o autorizador do Lambda, anexe-o a um método para a API. Você pode criar um método ou usar uma operação de patch para anexar um autorizador a um método existente. Se seu autorizador usa o armazenamento em cache de autorização, atualize a política para controlar o acesso ao método adicional.

O comando [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) indicado abaixo cria um método que usa um autorizador do Lambda:

```
aws apigateway put-method --rest-api-id 1234123412 \
  --resource-id a1b2c3 \
  --http-method PUT \
  --authorization-type CUSTOM \
  --authorizer-id efg1234
```

O comando [update-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-method.html) indicado abaixo atualiza um método existente para usar um autorizador do Lambda:

```
aws apigateway update-method \
    --rest-api-id 1234123412 \
    --resource-id a1b2c3 \
    --http-method PUT \
    --patch-operations op="replace",path="/authorizationType",value="CUSTOM" op="replace",path="/authorizerId",value="efg1234"
```

# Entrada para um autorizador do Lambda do API Gateway
<a name="api-gateway-lambda-authorizer-input"></a>

A seção a seguir explica o formato da entrada do API Gateway para um autorizador do Lambda.

## Formato de entrada do `TOKEN`
<a name="w2aac15b9c23c25c19b5"></a>

 Para um autorizador do Lambda (anteriormente conhecido como autorizador personalizado) do tipo `TOKEN`, você deve especificar um cabeçalho personalizado como **Token Source (Origem do token)** quando configurar o autorizador para sua API. O cliente da API deve repassar o token de autorização necessário nesse cabeçalho na solicitação de entrada. Ao receber a solicitação do método de entrada, o API Gateway extrai o token do cabeçalho personalizado. Ele passa o token como a propriedade `authorizationToken` do objeto `event` da função do Lambda, além do método ARN como a propriedade `methodArn`: 

```
{
    "type":"TOKEN",
    "authorizationToken":"{caller-supplied-token}",
    "methodArn":"arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
}
```

 Neste exemplo, a propriedade `type` especifica o tipo de autorizador, que é um autorizador `TOKEN`. O `{caller-supplied-token}` origina-se do cabeçalho de autorização em uma solicitação do cliente e pode ser qualquer valor de string. O `methodArn` é o ARN da solicitação de método de entrada e é preenchido pelo API Gateway de acordo com a configuração do autorizador do Lambda. 

## Formato de entrada da `REQUEST`
<a name="w2aac15b9c23c25c19b7"></a>

Para um autorizador do Lambda do tipo `REQUEST`, o API Gateway passa os parâmetros de solicitação para a função do Lambda do autorizador como parte do objeto `event`. Os parâmetros de solicitação incluem cabeçalhos, parâmetros de caminho, parâmetros de string de consulta, variáveis de estágio e algumas das variáveis de contexto de solicitação. O autor da chamada da API pode definir parâmetros de caminho, cabeçalhos e parâmetros de string de consulta. O desenvolvedor da API deve definir as variáveis de estágio durante a implantação da API e o API Gateway fornece o contexto de solicitação em tempo de execução. 

**nota**  
Os parâmetros de caminho podem ser passados como parâmetros da solicitação para a função do autorizador do Lambda, mas não podem ser usados como origens de identidade.

 O exemplo a seguir mostra uma entrada para um autorizador `REQUEST` de um método API (`GET /request`) com uma integração de proxy: 

```
{
  "type": "REQUEST",
  "methodArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request",
  "resource": "/request",
  "path": "/request",
  "httpMethod": "GET",
  "headers": {
    "X-AMZ-Date": "20170718T062915Z",
    "Accept": "*/*",
    "HeaderAuth1": "headerValue1",
    "CloudFront-Viewer-Country": "US",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Is-Mobile-Viewer": "false",
    "User-Agent": "..."
  },
  "queryStringParameters": {
    "QueryString1": "queryValue1"
  },
  "pathParameters": {},
  "stageVariables": {
    "StageVar1": "stageValue1"
  },
  "requestContext": {
    "path": "/request",
    "accountId": "123456789012",
    "resourceId": "05c7jb",
    "stage": "test",
    "requestId": "...",
    "identity": {
      "apiKey": "...",
      "sourceIp": "...",
      "clientCert": {
        "clientCertPem": "CERT_CONTENT",
        "subjectDN": "www.example.com",
        "issuerDN": "Example issuer",
        "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
        "validity": {
          "notBefore": "May 28 12:30:02 2019 GMT",
          "notAfter": "Aug  5 09:36:04 2021 GMT"
        }
      }
    },
    "resourcePath": "/request",
    "httpMethod": "GET",
    "apiId": "abcdef123"
  }
}
```

 O `requestContext` é um mapa de pares de chave/valor e corresponde à variável [\$1context](api-gateway-mapping-template-reference.md#context-variable-reference). Seu resultado é dependente da API.

 O API Gateway pode adicionar novas chaves ao mapa. Para obter mais informações sobre a entrada de função do Lambda na integração de proxy do Lambda, consulte [Formato de entrada de uma função do Lambda para integração de proxy](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format). 

# Saída de um autorizador do Lambda para o API Gateway
<a name="api-gateway-lambda-authorizer-output"></a>

A saída da função de autorizador do Lambda é um objeto em forma de dicionário, que deve incluir o identificador principal (`principalId`) e um documento de política (`policyDocument`) que contém uma lista de instruções da política. A saída também pode incluir um mapa `context` contendo pares de chave/valor. Se a API usar um plano de uso (o [https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource) é definido como `AUTHORIZER`), a função de autorizador do Lambda deve retornar uma das chaves de API do plano de uso como o valor de propriedade `usageIdentifierKey`.

Veja a seguir um exemplo dessa saída. 

------
#### [ JSON ]

****  

```
{
  "principalId": "yyyyyyyy", 
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow|Deny",
        "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
      }
    ]
  },
  "context": {
    "stringKey": "value",
    "numberKey": "1",
    "booleanKey": "true"
  },
  "usageIdentifierKey": "{api-key}"
}
```

------

 Aqui, uma declaração de política especifica se o serviço de execução do API Gateway deve ter permissão ou não (`Effect`) para invocar (`Action`) o método de API especificado (`Resource`). Talvez seja necessário controlar o acesso a vários recursos com base no seu autorizador. Você pode usar um caractere curinga (`*`) para especificar um tipo de recurso (método). Para obter informações sobre como configurar políticas válidas para chamar uma API, consulte [Referência de instrução de políticas do IAM para executar a API no API Gateway](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-calling-api-permissions). 

Para o ARN de um método habilitado para autorização, por exemplo, `arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]`, o tamanho máximo é de 1600 bytes. Os valores de parâmetros de caminho, cujo tamanho é determinado em tempo de execução, podem fazer com que o comprimento do ARN exceda o limite. Quando isso acontecer, o cliente da API receberá uma resposta `414 Request URI too long`. 

Além disso, o Nome de recurso da Amazon (ARN) do recurso, como mostrado na saída da declaração de política pelo autorizador, atualmente está limitado a 512 caracteres. Por esse motivo, você não deve usar o URI com um token de JWT de um tamanho significativo em um URI de solicitação. Em vez disso, você pode passar o token de JWT com segurança em um cabeçalho de solicitação.

 Você pode acessar o valor `principalId` em um modelo de mapeamento usando a variável `$context.authorizer.principalId`. Isso é útil quando você deseja passar o valor para o backend. Para obter mais informações, consulte [Variáveis de contexto para transformações de dados](api-gateway-mapping-template-reference.md#context-variable-reference). 

 Você pode acessar o valor `stringKey`, `numberKey` ou `booleanKey` (por exemplo, `"value"`, `"1"` ou `"true"`) do mapa `context` em um modelo de mapeamento chamando `$context.authorizer.stringKey`, `$context.authorizer.numberKey` ou `$context.authorizer.booleanKey`, respectivamente. Todos os valores retornados são transformados em string. Observe que não é possível definir um objeto JSON ou matriz como um valor válido de qualquer chave no mapa `context`. 

 Você pode usar o mapa `context` para retornar credenciais em cache do autorizador para o backend usando um modelo de mapeamento de solicitação de integração. Isso permite que o backend forneça uma experiência de usuário aprimorada usando as credenciais em cache para reduzir a necessidade de acessar as chaves secretas e abrir o tokens de autorização para cada solicitação. 

 Para a integração de proxy do Lambda, o API Gateway passa o objeto `context` de um autorizador do Lambda diretamente para a função backend do Lambda como parte da entrada `event`. Você pode recuperar os pares de chave-valor `context` na função do Lambda chamando `$event.requestContext.authorizer.key`. 

`{api-key}` significa uma chave de API no plano de uso do estágio da API. Para obter mais informações, consulte [Usar planos e chaves de API para APIs REST no APIs Gateway](api-gateway-api-usage-plans.md).

 Veja a seguir a saída de exemplo do autorizador do Lambda de exemplo. A saída de exemplo contém uma declaração de política para bloquear chamadas (`Deny`) para o método `GET` no estágio `dev` de uma API (`ymy8tbxw7b`) de uma conta da AWS (`123456789012`).

------
#### [ JSON ]

****  

```
{
  "principalId": "user",
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Deny",
        "Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/dev/GET/"
      }
    ]
  }
}
```

------

# Chamar uma API com um autorizador do Lambda do API Gateway
<a name="call-api-with-api-gateway-lambda-authorization"></a>

 Depois de configurar o autorizador do Lambda (anteriormente conhecido como autorizador personalizado) e implantar a API, você deve testar a API com o autorizador do Lambda habilitado. Para isso, você precisa de um cliente REST, como cURL ou [Postman](https://www.postman.com/). Para os exemplos a seguir, usamos Postman. 

**nota**  
 Ao chamar um método habilitado para o autorizador, o API Gateway não registrará a chamada para o CloudWatch se o token necessário para o autorizador `TOKEN` não estiver definido, for nulo ou for invalidado pela **Token validation expression (Expressão de validação do token)** especificada. Da mesma forma, o API Gateway não registrará a chamada para o CloudWatch se qualquer uma das origens de identidade necessárias para o autorizador `REQUEST` não estiver definida ou for nula ou vazia.

 No próximo exemplo, mostramos como usar o Postman para chamar ou testar uma API com um autorizador do Lambda `TOKEN`. O método pode ser aplicado para chamar uma API com um autorizador `REQUEST` do Lambda, se você especificar explicitamente o caminho, o cabeçalho ou os parâmetros de string de consulta necessários. 

**Para chamar uma API com o autorizador `TOKEN` personalizado**

1.  Abra **Postman**, escolha o método **GET** e cole **Invoke URL (Invocar URL)** da API no campo de URL adjacente. 

    Adicione o cabeçalho do token de autorização do Lambda e defina o valor como `allow`. Selecione **Send (Enviar)**.   
![\[Chamar a API com o token de permissão de autorização do Lambda\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/custom-auth-call-api-with-allow-token.png)

    A resposta mostra que o autorizador do Lambda do API Gateway retorna uma resposta **200 OK** e autoriza com êxito a chamada para acessar o endpoint HTTP (http://httpbin.org/get) integrado com o método. 

1.  Ainda no Postman, altere o valor do cabeçalho do token de autorização do Lambda para `deny`. Selecione **Send (Enviar)**.   
![\[Chamar a API com o token de autorização de negação do Lambda\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/custom-auth-call-api-with-deny-token.png)

   A resposta mostra que o autorizador do Lambda do API Gateway retorna uma resposta **403 Forbidden** sem autorizar a chamada para acessar o endpoint HTTP.

1.  No Postman, altere o valor do cabeçalho do token de autorização do Lambda para `unauthorized` e escolha **Send (Enviar)**.   
![\[Chamar a API com o token não autorizado de autorização do Lambda\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/custom-auth-call-api-with-unauthorized-token.png)

    A resposta mostra que o API Gateway retorna uma resposta **401 Unauthorized** sem autorizar a chamada para acessar o endpoint HTTP. 

1.  Agora, altere o valor do cabeçalho do token de autorização do Lambda para `fail`. Selecione **Send (Enviar)**.   
![\[Chamar a API com o token de autorização de falha do Lambda\]](http://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/images/custom-auth-call-api-with-fail-token.png)

    A resposta mostra que o API Gateway retorna uma resposta **500 Internal Server Error** sem autorizar a chamada para acessar o endpoint HTTP. 

# Configurar um autorizador do Lambda do API Gateway entre contas
<a name="apigateway-lambda-authorizer-cross-account-lambda-authorizer"></a>

Agora você também pode usar uma função do AWS Lambda de uma conta da AWS diferente como sua função do autorizador da API. Cada conta pode estar em qualquer região onde o Amazon API Gateway está disponível. A função do autorizador do Lambda pode usar estratégias de autenticação de token de portador, como OAuth ou SAML. Isso facilita o gerenciamento centralizado e o compartilhamento da função de autorizador do Lambda central em várias APIs do API Gateway.

Nesta seção, mostramos como configurar uma função de autorização do Lambda entre contas usando o console do Amazon API Gateway.

Estas instruções pressupõem que você já tem uma API do API Gateway em uma conta da AWS e uma função do autorizador do Lambda em outra conta.

## Como configurar um autorizador do Lambda entre contas usando o console do API Gateway
<a name="apigateway-cross-account-lambda-auth-configure-cross-account-authorizer"></a>

Faça login no console do Amazon API Gateway na conta que contém a sua API e faça o seguinte:

1. Escolha sua API e, no painel de navegação principal, selecione **Autorizadores**.

1. Selecione **Criar autorizador**. 

1. Em **Nome do autorizador**, insira um nome para o autorizador.

1. Em **Tipo de autorizador**, selecione **Lambda**.

1. Em **Função do Lambda**, insira o ARN completo da função do autorizador do Lambda na sua segunda conta.
**nota**  
No console do Lambda, você pode encontrar o ARN da sua função no canto superior direito da janela.

1. Um aviso com uma string de comando `aws lambda add-permission` será exibido. A política concede permissão do API Gateway para invocar a função do Lambda do autorizador. Copie o comando e salve-o para mais tarde. Execute o comando depois de criar o autorizador.

1. Em **Carga útil do evento do Lambda**, escolha **Token** para um autorizador `TOKEN` ou **Solicitação** para um autorizador `REQUEST`.

1. Dependendo da opção da etapa anterior, siga um destes procedimentos:

   1.  Para a opção **Token**, faça o seguinte: 
      + Em **Origem do token**, insira o nome do cabeçalho que contém o token de autorização. O cliente da API deve incluir um cabeçalho desse nome para enviar o token de autorização ao autorizador do Lambda. 
      + Opcionalmente, em **Validação do Token**, insira uma instrução RegEx. O API Gateway executa a validação inicial do token de entrada em relação a esta expressão e invoca o autorizador mediante a validação com êxito. Isso ajuda a reduzir as chamadas para a API. 
      + Para armazenar em cache a política de autorização gerada pelo autorizador, mantenha **Armazenamento em cache de autorização** ativado. Quando o armazenamento em cache de políticas está habilitado, você pode optar por modificar o valor **TTL**. A definição de **TTL** como zero desabilita o armazenamento em cache de políticas. Quando o armazenamento em cache de políticas está habilitado, o nome de cabeçalho especificado em **Origem do token** se torna a chave de cache. Se vários valores forem passados para esse cabeçalho na solicitação, todos os valores se tornarão a chave de cache, com a ordem preservada.
**nota**  
O valor de **TTL** padrão é de 300 segundos. O valor máximo é de 3600 segundos. Não é possível aumentar esse limite.

   1. Para a opção de **Request (Solicitação)**, faça o seguinte:
      + Em **Tipo de origem de identidade**, selecione um tipo de parâmetro. Os tipos de parâmetros com suporte são `Header`, `Query string`, `Stage variable` e `Context`. Para adicionar mais origens de identidade, escolha **Adicionar parâmetro**. 
      + Para armazenar em cache a política de autorização gerada pelo autorizador, mantenha **Armazenamento em cache de autorização** ativado. Quando o armazenamento em cache de políticas está habilitado, você pode optar por modificar o valor **TTL**. A definição de **TTL** como zero desabilita o armazenamento em cache de políticas.

        O API Gateway usa as origens de identidade especificadas como a chave de cache do autorizador de solicitação. Quando o armazenamento em cache é ativado, o API Gateway chama a função do Lambda do autorizador somente depois de verificar com sucesso que todas as origens de identidade especificadas estão presentes em tempo de execução. Se uma origem de identidade especificada estiver ausente, for nula ou vazia, o API Gateway retornará uma resposta `401 Unauthorized` sem chamar a função do Lambda do autorizador. 

        Quando várias origens de identidade são definidas, todas são usadas para derivar a chave de cache do autorizador. A alteração de qualquer parte da chave de cache faz com que o autorizador descarte o documento de política armazenado em cache e gere um novo. Se um cabeçalho com vários valores for passado na solicitação, todos os valores farão parte da chave de cache, com a ordem preservada. 
      + Quando o armazenamento em cache está desativado, não é necessário especificar uma origem de identidade.
**nota**  
 Para habilitar o armazenamento em cache, o autorizador deve retornar uma política que seja aplicável a todos os métodos em uma API. Para aplicar uma política de método específico, você pode desativar **Armazenamento em cache de autorização**. 

1. Selecione **Criar autorizador**.

1. Cole a string do comando `aws lambda add-permission` que você copiou de uma etapa anterior em uma janela da AWS CLI configurada para sua segunda conta. Substitua `AUTHORIZER_ID` pelo ID do seu autorizador. Isso concederá acesso para sua primeira conta à função do autorizador do Lambda da sua segunda conta.

# Controlar o acesso com base nos atributos de uma identidade com o Verified Permissions
<a name="apigateway-lambda-authorizer-verified-permissions"></a>

Use o Amazon Verified Permissions para controlar o acesso à sua API do API Gateway. Quando você usa o API Gateway com o Verified Permissions, ele cria um autorizador do Lambda que usa decisões de autorização refinadas para controlar o acesso à sua API. O Verified Permissions autoriza os chamadores com base em políticas e em um esquema de armazenamento de políticas usando a linguagem Cedar para definir permissões refinadas para usuários de aplicações. Para saber mais, consulte [Create a policy store with a connected API and identity provider](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/getting-started-api-policy-store.html) no *Guia do usuário do Amazon Verified Permissions*.

O Verified Permissions comporta grupos de usuários do Amazon Cognito ou provedores de identidade OpenID Connect (OIDC) como fontes de identidade. O Verified Permissions pressupõe que a entidade principal tenha sido previamente identificada e autenticada. O Verified Permissions só é compatível com APIs REST regionais e otimizadas para borda.

## Criar um autorizador do Lambda usando o Verified Permissions
<a name="apigateway-lambda-authorizer-verified-permissions-attach"></a>

O Verified Permissions cria um autorizador do Lambda para determinar se uma entidade principal pode realizar uma ação em sua API. Você precisa criar a política do Cedar que o Verified Permissions usa para realizar suas tarefas de autorização.

Veja a seguir um exemplo de política do Cedar que permite o acesso para invocar uma API com base no grupo de usuários do Amazon Cognito, `us-east-1_ABC1234`, para o grupo `developer` no recurso `GET /users` de uma API. O Verified Permissions determina a associação ao grupo analisando o token da identidade do chamador. 

```
permit(
  principal in MyAPI::UserGroup::"us-east-1_ABC1234|developer",
  action in [ MyAPI::Action::"get /users" ],
  resource
  );
```

O Verified Permissions também pode anexar o autorizador aos métodos da sua API. Nos estágios de produção da sua API, recomendamos não permitir que o Verified Permissions anexe o autorizador para você.

A lista a seguir mostra como configurar o Verified Permissions para anexar ou não o autorizador do Lambda à solicitação dos métodos da sua API.

**Anexar o autorizador para você (Console de gerenciamento da AWS)**  
Ao escolher **Criar armazenamento de políticas** no console do Verified Permissions, na página **Implantar integração de aplicações**, escolha **Agora**.

**Não anexe o autorizador para você (Console de gerenciamento da AWS)**  
Ao escolher **Criar armazenamento de políticas** no console do Verified Permissions, na página **Implantar integração de aplicações**, escolha **Mais tarde**.  
O Verified Permissions ainda cria um autorizador do Lambda para você. O autorizador do Lambda começa com `AVPAuthorizerLambda-`. Para ter mais instruções sobre como anexar a autorização em um método, consulte [Configurar um método para usar um autorizador do Lambda (console)](configure-api-gateway-lambda-authorization.md#configure-api-gateway-lambda-authorization-method-console).

**Anexar o autorizador para você (CloudFormation)**  
No modelo do CloudFormation gerado pelo Verified Permissions, na seção `Conditions`, defina `"Ref": "shouldAttachAuthorizer"` como `true`.

**Não anexe o autorizador para você (CloudFormation)**  
No modelo do CloudFormation gerado pelo Verified Permissions, na seção `Conditions`, defina `"Ref": "shouldAttachAuthorizer"` como `false`.  
O Verified Permissions ainda cria um autorizador do Lambda para você. O autorizador do Lambda começa com `AVPAuthorizerLambda-`. Para ter mais instruções sobre como anexar a autorização em um método, consulte [Configurar um método para usar um autorizador do Lambda (AWS CLI)](configure-api-gateway-lambda-authorization.md#configure-api-gateway-lambda-authorization-method-cli).

## Chamar um autorizador do Lambda usando o Verified Permissions
<a name="apigateway-lambda-authorizer-verified-permissions-call"></a>

É possível chamar o autorizador do Lambda fornecendo uma identidade ou um token de acesso no cabeçalho `Authorization`. Para obter mais informações, consulte [Chamar uma API com um autorizador do Lambda do API Gateway](call-api-with-api-gateway-lambda-authorization.md).

O API Gateway armazena em cache a política que o autorizador do Lambda exibe por 120 segundos. É possível modificar o TTL no console do API Gateway ou usando a AWS CLI.