Как поддерживать состояние сеанса в AWS Lambda? Например, если мне нужно запросить DynamoDb для получения информации о подписке для вошедшего в систему пользователя, как мне это сделать с помощью функции Lambda, если пользователь использует веб-приложение AngularJS? У меня есть пользователь, входящий в систему с помощью Auth0, и настраиваемый авторизатор, который проверяет пользователя на AWS. Но затем я хочу использовать CognitoID зарегистрированных пользователей для запроса DynamoDB.

Согласно документации AWS для Lambda (node.js) (https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html) у вас есть информация о провайдере идентификации Amazon Cognito только при вызове через AWS Мобильный SDK.

Identity.cognitoIdentityId

Identity.cognitoIdentityPoolId

Но что, если я использую веб-приложение, использующее AngularJS и Auth0?

Хорошо, возможно, самое простое решение для хранения информации о пользователе в DynamoDB - это просто извлечь клиентскую часть JWT в AngularJS и использовать извлеченный Auth0 user_id, например facebook | 12345, отправить его в запросе API к Lambda, который запрашивает, существует ли пользователь в DynamoDB и, если нет, создает новую запись. Затем в каждом запросе к API, который должен запрашивать информацию о пользователе, я отправляю user_id, а в Lambda я запрашиваю db с этим идентификатором. Это должно быть безопасно, поскольку я проверяю токен пользователя в Custom Authorizer и запрещаю или разрешаю, прежде чем он попадет в Lambda.

0
Molnfront 14 Мар 2018 в 03:07

2 ответа

Лучший ответ

Прежде всего, Lambda используется как вычислительная служба без сохранения состояния. Поэтому сохранение состояния сеанса в Lambda нецелесообразно.

В зависимости от вашего сценария вы можете отправить запрос на API-шлюз с токеном jwt, где вы можете подключить специальный авторизатор вызова специальной функции Lambda, где вы выполняете проверку токена и извлекаете идентификатор пользователя, который затем пересылается в Business Логическая лямбда-функция, подключенная к конечной точке шлюза API. Как вы упомянули в Custom Authorizer, вы можете запросить базу данных пользователей и вернуть дополнительную информацию в Business Logic Lambda.

Если токен недействителен или срок его действия истек, вы можете вернуть ошибку из функции Custom Authorizer Lambda, чтобы шлюз API отправлял ответ с ошибкой, не затрагивая Lambda конечной точки.

Кроме того, вы также можете кэшировать вывод Custom Authorizer Lambda, чтобы он был кэширован для данного TTL для повышения производительности и снижения затрат.

5
Ashan 14 Мар 2018 в 02:10

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

Ведение таблиц DynamoDB для пользователей и сеансов. Когда пользователь входит в систему с Cognito, создайте новый элемент в таблице сеансов с UUID, именем пользователя и меткой времени последнего доступа. Для всех последующих вызовов вошедших в систему пользователей найдите имя пользователя в таблице сеансов и обновите время последнего доступа. Затем вы можете сохранить любые значения сеанса в таблице сеансов или в отдельных таблицах, которые также имеют идентификатор сеанса.

Если пользователь выходит из системы с помощью Cognito, удалите (или отметьте как завершенный) элемент сеанса и все его данные. Если вы когда-нибудь увидите время lastAccessed, которое превышает час (или любое другое время сохранения активности, которое вы хотите), удалите (или отметьте как завершенный) этот элемент сеанса и все его данные.

0
Tom Hubbard 15 Окт 2019 в 17:18