Уточнение: отсутствует ошибка заголовка CORS «Access-Control-Allow-Origin», даже если в заголовках API-шлюза и лямбда-данных включен CORS - PullRequest
0 голосов
/ 14 апреля 2020

Я использую Amplify, и мой API-шлюз проксирует до Lambda. Я включил CORS на моем /{proxy+} и развернул API. В моей лямбда-функции я устанавливаю соответствующий заголовок в своей тривиальной функции:

import json


def handler(event, context):
    print("received event:")
    print(event)
    return {
        "statusCode": 200,
        "headers": {
            "Access-Control-Allow-Credentials": True,
            "Access-Control-Allow-Headers": "Content-Type",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET",
            "Access-Control-Allow-Origin": "*",
        },
        "body": json.dumps(event),
    }

Эта лямбда-функция находится за ресурсом шлюза API, который аутентифицируется через Cognito.

Когда я вызываю мой API с использованием Amplify:

let myInit = {
          headers: {
            Authorization: `Bearer ${(await Auth.currentSession())
              .getIdToken()
              .getJwtToken()}`
          }
        }; 

API.get("adminapi", "/admin", myInit) ...

В моем запросе GET отсутствует:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/admin. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

* отсутствует ужасный заголовок CORS 'Access-Control-Allow-Origin': 1015 * Я вижу, что он вернулся в запросе OPTIONS:

enter image description here

Я даже проверил в Postman, чтобы убедиться, что заголовки возвращаются:

enter image description here

Что я здесь не так делаю? Не похоже, что вызов проходит мимо шлюза API. Интересно, имеет ли это отношение к аутентификации. Когда я тестирую из Postman, используя свои учетные данные IAM, он работает нормально, но из моего веб-приложения, использующего токен на предъявителя, происходит сбой, как указано выше.

1 Ответ

0 голосов
/ 14 апреля 2020

Я предполагаю, что вы забыли обработать глагол OPTIONS, который используется для запроса предварительной проверки , и вернуть туда заголовок.

Вы отправляете заголовок Authorization, который отсутствует в списке разрешенных заголовков для «простых» запросов , следовательно, предварительно выданный запрос выполняется.

Кроме того, для учетных данных для Чтобы пройти через , вы должны убедиться, что заголовок Access-Control-Allow-Credentials: true также установлен.

Из фрагмента кода неясно, какой тип содержимого у вашего тела запроса, но если это что-то отличное от application/x-www-form-urlencoded, multipart/form-data или text/plain (скажем, application/json), вам также необходимо добавить в белый список заголовок Content-Type, используя Access-Control-Allow-Headers: Content-Type.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...