401 возврат из API-шлюза Пользовательский автозапуск отсутствует Заголовок "Access-Control-Allow-Origin"
Чтобы пользователи, не вошедшие в систему, не вызывали мою лямбда-функцию через AWS API Gateway, я использую лямбда-решение Custom Authorizer.
Если запрос авторизован (200), и я получаю ответ от вызываемой лямбды, все работает нормально, и я получаю заголовок Access-Control-Allow-Origin
.
Но если запрос не авторизован, я получаю 401, у которого нет заголовка Access-Control-Allow-Origin
, поэтому я не могу прочитать состояние ответа 401 и перенаправить пользователя на страницу входа.
Я полагаю, что это потому, что механизм Custom Autorization не знает, что запрос должен использовать CORS. Кто-нибудь знает, что это на самом деле проблема? Вам известно о каком-либо возможном решении?
Ответы
Ответ 1
Я рад объявить о новой функции ответов шлюза, которая позволяет настраивать ответы на ошибки для запросов, которые не вызывают интеграцию. Это позволяет гарантировать, что заголовки CORS включены даже при неудачных запросах аутентификации.
Подробнее читайте в нашей документации, которая включает пример CORS.
Ответ 2
Да, это известная ошибка с пользовательскими авторизаторами API Gateway. Спасибо, что сообщили нам об этом. Команда обновит этот пост, когда мы развернем исправление. Извиняюсь за неудобства.
Ответ 3
Самый простой способ решить эту проблему для всех ошибок 4XX (включая ошибки 401) - перейти к "Ответам шлюза", затем выбрать "Default 4XX", а затем добавить заголовок "Access-Control-Allow-Origin" со значением '* ".
Смотрите скриншот: ![]()
Ответ 4
Поскольку мне потребовалось некоторое время, чтобы понять, как собрать все это вместе в Cloud Formation, вот фрагмент, показывающий, как его настроить.
...
MyApi:
Type: "AWS::ApiGateway::MyApi"
Properties:
Description: My API
Name: "my-api"
MyApiAuthorizer:
Type: "AWS::ApiGateway::Authorizer"
Properties:
Name: "my-api-authorizer"
IdentitySource: "method.request.header.Authorization"
ProviderARNs:
- !GetAtt MyUserPool.Arn
RestApiId: !Ref MyAApi
Type: COGNITO_USER_POOLS
MyApiGatewayResponse:
Type: "AWS::ApiGateway::GatewayResponse"
Properties:
ResponseParameters:
"gatewayresponse.header.Access-Control-Allow-Origin": "'*'"
"gatewayresponse.header.Access-Control-Allow-Headers": "'*'"
ResponseType: UNAUTHORIZED
RestApiId: !Ref MyApi
StatusCode: "401"
Ответ 5
В дополнение к ответам выше, если вы не используете шаблон Cloudformation/SAM, вы можете сэкономить некоторые ручные шаги, используя этот скрипт на python:
import boto3
import sys
if len(sys.argv) != 3:
print("usage: python script.py <API_ID> <STAGE>")
exit()
client = boto3.client('apigateway')
response = client.put_gateway_response(
restApiId=sys.argv[1],
responseType='UNAUTHORIZED',
statusCode='401',
responseParameters={
"gatewayresponse.header.Access-Control-Allow-Origin": "'*'",
"gatewayresponse.header.Access-Control-Allow-Headers": "'*'"
}
)
response = client.create_deployment(
restApiId=sys.argv[1],
stageName=sys.argv[2])
Ответ 6
Это работает для меня (встроено в AWS :: APIGateway: определение)
Resources:
MyApi:
Type: AWS::Serverless::Api
Properties:
StageName: Dev
GatewayResponses:
UNAUTHORIZED:
StatusCode: 401
ResponseParameters:
Headers:
Access-Control-Allow-Origin: "'*'"
ACCESS_DENIED:
StatusCode: 403
ResponseParameters:
Headers:
Access-Control-Allow-Origin: "'*'"
DEFAULT_5XX:
StatusCode: 500
ResponseParameters:
Headers:
Access-Control-Allow-Origin: "'*'"
RESOURCE_NOT_FOUND:
StatusCode: 404
ResponseParameters:
Headers:
Access-Control-Allow-Origin: "'*'"
Доступными именами GatewayResponses являются:
Указан неверный GatewayResponseType. Допустимые варианты
DEFAULT_INTERNAL,
DEFAULT_4XX,
DEFAULT_5XX,
RESOURCE_NOT_FOUND,
НЕСАНКЦИОНИРОВАННОЕ,
ДОСТУП НЕ РАЗРЕШЕН,
AUTHORIZER_FAILURE,
AUTHORIZER_CONFIGURATION_ERROR,
MISSING_AUTHENTICATION_TOKEN,
INVALID_SIGNATURE,
EXPIRED_TOKEN,
INTEGRATION_FAILURE,
INTEGRATION_TIMEOUT,
API_CONFIGURATION_ERROR,
UNSUPPORTED_MEDIA_TYPE,
REQUEST_TOO_LARGE,
BAD_REQUEST_PARAMETERS,
BAD_REQUEST_BODY,
задушил,
КВОТА ПРЕВЫШЕНА,
INVALID_API_KEY,
WAF_FILTERED
Таким образом, вы можете указать настройку Ответа для этих управляемых ответов AWS.