Как интегрировать API-шлюз с Cognito Federated Identity и Cognito User Pools - PullRequest
0 голосов
/ 04 сентября 2018

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

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

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

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

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

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

0 голосов
/ 28 ноября 2018

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

...