Сообщение об отказе в доступе к 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. Чтобы изменить это -
- Перейдите в "Ответы шлюза" в левом столбце вашего API.
- Выберите "Доступ запрещен" и нажмите "Изменить" в правом верхнем углу.
- Щелкните "application/json" в разделе "Шаблоны ответов".
- Измените там сообщение как {"message":"Ваше собственное сообщение"} в разделе "Шаблон тела ответа".
- Разверните 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"
}