Создание платного API путем связывания ключей API, планов использования и Cognito - PullRequest
2 голосов
/ 17 января 2020

Я создавал REST API без сервера с AWS API Gateway, Lambda и Serverless Framework. Я хочу создать веб-сайт, на котором пользователи будут регистрироваться, выбрать план API (бесплатный, basi c, pro) и получить соответствующий долговременный ключ API, с помощью которого они могут запрашивать безсерверный API определенное количество раз в месяц. .

Я понимаю, что с Cognito и автономным пользовательским интерфейсом вы можете легко обрабатывать аутентификацию пользователей с помощью токенов CUP (Cognito User Pool), которые на самом деле являются Json веб-токенами. Я хотел бы автоматически создать и связать ключ API с планом использования, а затем с пользователем Cognito.

Первая часть проста: с SDK AWS Javascript это так же просто, как сделать :

var params = {
  keyId: 'whateverKeyId', /* required */
  keyType: 'API_KEY', /* required */
  usagePlanId: 'whateverUsagePlanId' /* required */
};
apigateway.createUsagePlanKey(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

Я борюсь со второй частью ... Должен ли я добавить ключ API в качестве пользовательского атрибута в пул пользователей? Но тогда я не знаю, как получить ключ API. Документация не совсем понятна. Добавить пользователя и ключ API в мою собственную базу данных DynamoDB после регистрации (что на самом деле было бы пустой тратой Cognito)?

Если честно, это похоже на обычный сценарий и тот факт, что я провел три дня поиск решения по всему inte rnet без успеха заставляет меня думать, что есть кое-что, чего я не понимаю ...

Заранее спасибо за ваш вклад!

1 Ответ

1 голос
/ 17 января 2020

Рекомендуется добавить ключ API в качестве пользовательского атрибута в пул пользователей Cognito.

Каждый раз, когда пользователь входит в систему, cognito возвращает идентификатор ID в формате JWT. Из этого токена вы можете получить атрибуты пользователя Cognito как пользовательские атрибуты и значения по умолчанию. Вы можете найти дополнительную информацию о токенах Cognito здесь:

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

и

https://aws.amazon.com/premiumsupport/knowledge-center/decode-verify-cognito-json-token/

Итак, что вы можете сделать:

  1. Создать AWS API-шлюз. Создайте авторизатор и подключите его к вашему AWS cognito pool. В методе Request каждого ресурса API для вас выберите этот новый авторизатор, чтобы авторизовать пользователя каждый раз, когда он вызывает ваш API.
  2. Когда ваш пользователь входит в систему cognito, cognito возвращает токен идентификатора, который я описал выше, в формате JWT, передайте этот токен JWT в качестве заголовка при вызове API.
  3. Если вы выполните описанные выше шаги, то этот токен JWT будет передан вашей лямбда-функции, а внутри лямбда-функции вы сможете получить пользовательский атрибут cognito (ключ API):

    const API_ID = event.requestContext.authorizer.claims['custom:apiid'];
    

В строке выше извлекает JWT из заголовка вашего авторизатора API, а затем извлекает пользовательский атрибут, созданный вами в cognito, который называется «apiid» или как вы хотите его назвать.

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