Подтвердить что ты не робот

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. Кто-нибудь знает, что это на самом деле проблема? Вам известно о каком-либо возможном решении?

4b9b3361

Ответ 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.