Сообщение об отказе в доступе к AWS API Gateway из политики ресурсов

Как можно изменить тело 403 по умолчанию из-за ошибки политики ресурсов AWS API Gateway?

{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource:... with an explicit deny"}

2 ответа

Решение

Вы можете использовать ответы шлюза в API-шлюзе, чтобы изменить код состояния HTTP и ответ, который возвращается клиенту.

По умолчанию для описанного вами сценария ответом является большое сообщение, которое вы видите, а код состояния - 403. Чтобы изменить это -

  1. Перейдите в "Ответы шлюза" в левом столбце вашего API.
  2. Выберите "Доступ запрещен" и нажмите "Изменить" в правом верхнем углу.
  3. Щелкните "application/json" в разделе "Шаблоны ответов".
  4. Измените там сообщение как {"message":"Ваше собственное сообщение"} в разделе "Шаблон тела ответа".
  5. Разверните API и подождите минуту, чтобы изменения вступили в силу.

Если вы видите изображение ниже, я изменил код состояния на 401 и сообщение на "Неавторизовано".

Не уверен, изменилось ли это, но мой API ограничен источниками с известных IP-адресов за счет использования политики ресурсов - это выдает ответ «DEFAULT_4XX», поэтому именно его необходимо обновить в ответах шлюза (а затем развернутый API для распространения изменения), а не ответ «Отказано в доступе».

Доступные поля для шаблона перечислены ниже, хотя, поскольку это ответ 4XX по умолчанию, вы можете рассмотреть общие ответы...

      {
    "context.accountId": "$context.accountId",
    "context.apiId": "$context.apiId",
    "context.authorizer.claims.property": "$context.authorizer.claims.property",
    "context.authorizer.principalId": "$context.authorizer.principalId",
    "context.authorizer.property": "$context.authorizer.property",
    "context.awsEndpointRequestId": "$context.awsEndpointRequestId",
    "context.domainName": "$context.domainName",
    "context.domainPrefix": "$context.domainPrefix",
    "context.error.message": "$context.error.message",
    "context.error.messageString": "$context.error.messageString",
    "context.error.responseType": "$context.error.responseType",
    "context.error.validationErrorString": "$context.error.validationErrorString",
    "context.extendedRequestId": "$context.extendedRequestId",
    "context.httpMethod": "$context.httpMethod",
    "context.identity.accountId": "$context.identity.accountId",
    "context.identity.apiKey": "$context.identity.apiKey",
    "context.identity.apiKeyId": "$context.identity.apiKeyId",
    "context.identity.caller": "$context.identity.caller",
    "context.identity.cognitoAuthenticationProvider": "$context.identity.cognitoAuthenticationProvider",
    "context.identity.cognitoAuthenticationType": "$context.identity.cognitoAuthenticationType",
    "context.identity.cognitoIdentityId": "$context.identity.cognitoIdentityId",
    "context.identity.cognitoIdentityPoolId": "$context.identity.cognitoIdentityPoolId",
    "context.identity.principalOrgId": "$context.identity.principalOrgId",
    "context.identity.sourceIp": "$context.identity.sourceIp",
    "context.identity.clientCert.clientCertPem": "$context.identity.clientCert.clientCertPem",
    "context.identity.clientCert.subjectDN": "$context.identity.clientCert.subjectDN",
    "context.identity.clientCert.issuerDN": "$context.identity.clientCert.issuerDN",
    "context.identity.clientCert.serialNumber": "$context.identity.clientCert.serialNumber",
    "context.identity.clientCert.validity.notBefore": "$context.identity.clientCert.validity.notBefore",
    "context.identity.clientCert.validity.notAfter": "$context.identity.clientCert.validity.notAfter",
    "context.identity.user": "$context.identity.user",
    "context.identity.userAgent": "$context.identity.userAgent",
    "context.identity.userArn": "$context.identity.userArn",
    "context.path": "$context.path",
    "context.protocol": "$context.protocol",
    "context.requestId": "$context.requestId",
    "context.requestOverride.header.header_name": "$context.requestOverride.header.header_name",
    "context.requestOverride.path.path_name": "$context.requestOverride.path.path_name",
    "context.requestOverride.querystring.querystring_name": "$context.requestOverride.querystring.querystring_name",
    "context.responseOverride.header.header_name": "$context.responseOverride.header.header_name",
    "context.responseOverride.status": "$context.responseOverride.status",
    "context.requestTime": "$context.requestTime",
    "context.requestTimeEpoch": "$context.requestTimeEpoch",
    "context.resourceId": "$context.resourceId",
    "context.resourcePath": "$context.resourcePath",
    "context.stage": "$context.stage",
    "context.wafResponseCode": "$context.wafResponseCode",
    "context.webaclArn": "$context.webaclArn"
}
Другие вопросы по тегам