Как интегрировать 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 вы можете получить доступ к этой детали.