Как интегрировать API Gateway с Cognito Federated Identity и Cognito User Pools

В AWS я создал API-шлюз, который вызывает функцию Lambda. Пользователи получают доступ, войдя в Cognito User Pool, связанный с Cognito Federated Identity Pool, и связанные роли IAM содержат разрешения на вызов API. Метод API Gateway представляет собой запрос POST.

Если я использую пул пользователей в качестве авторизатора шлюза API, я могу успешно запускать функцию Lambda с помощью запроса ajax в моем веб-приложении на javascript - заметьте, однако, что он предоставляет одинаковый доступ каждому пользователю в пуле. Я пытаюсь создать различный доступ на основе Cognito User Group для разных методов, и, поскольку я, очевидно, не могу указать разные группы пользователей для каждого метода при использовании Cognito User Pool в качестве авторизатора, я теперь вижу, могу ли я защитить API с помощью AWS_IAM как API авторизатор. Однако, если я выберу AWS_IAM в качестве авторизатора, я вернусь:

В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Происхождение 'null', следовательно, не разрешено. Ответ имел HTTP-код состояния 403.

В чем может быть проблема? Как правильно настроить CORS для этого сценария и как должен выглядеть мой ajax-запрос в клиентском javascript? Cognito позаботится о подписи для меня или мне нужно что-то сделать с заголовками?

Когда я использовал Cognito User Pool, у меня было:

$.ajax({
    method: 'POST',
    url: _config.api.invokeUrl + '/savesurv', 
    headers: {
        Authorization: authToken
    },
    data: JSON.stringify(Data),
    contentType: 'application/json',
    success: callback,//console.log("complete"),
    error: function ajaxError(jqXHR, textStatus, errorThrown) {
        console.error('Error requesting save: ', textStatus, ', Details: ', errorThrown);
        console.error('Response: ', jqXHR.responseText);
        alert('An error occured when requesting to save:\n' + jqXHR.responseText);
    }
});

В этом случае это сработало. Нужно ли менять его при использовании AWS_IAM в качестве авторизации для шлюза API?

1 ответ

Решение

Проблема здесь в том, что, когда вы перешли на использование AWS_IAM как авторизатор для вашего метода API Gateway, запрос должен теперь содержать определенные заголовки amazon, а не только Authorization заголовок, как вы указали.

Это называется подписанным запросом Sigv4, и дополнительную информацию о том, как создать запрос, можно найти здесь:

https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

Таким образом, чтобы ответить на ваш вопрос, Cognito не позаботится о подписании, и вам придется сделать дополнительные шаги или получить платформу для решения этой проблемы за вас.

Я получил это, чтобы использовать Amplify ( https://aws-amplify.github.io/) для генерации моих запросов API, и эта структура позаботится о подписании запросов для вас.

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

Стоит отметить, что если вы декодируете свой токен JWT ID (тот, который вы передаете как authToken) с помощью такого инструмента, как https://jwt.io/ он содержит информацию о группах, в которые входит ваш пользователь, с которыми вы можете работать. Я предполагаю, что API Gateway будет проверять подлинность токена, чтобы вы могли положиться на значения, которые он содержит. Тогда в API Gateway вы можете получить доступ к этой детали.

Другие вопросы по тегам