AWS Cognito триггер Lambda после аутентификации – вернуть NotAuthorizedException

Вопрос или проблема

Я реализовал функциональность мягкого удаления с помощью Cognito, пометив поле статуса пользователя как удаленное. Однако мне нужно перехватывать попытки входа и отклонять их в триггере Lambda после аутентификации, как если бы это были нераспознанные пользователи. Как это сделать на Python 3.9?

Все, что я получаю, это “Нераспознаваемый выход Lambda” и “InvalidLambdaResponseException”, когда я пытаюсь вернуть ошибку.

Я пытался вызвать ошибку или что-то вроде:

          return {
                    "body": json.dumps({}, default=str),
                    "statusCode": 400,
                    "headers": {
                        "Access-Control-Allow-Origin": "*",
                        "Access-Control-Expose-Headers": "x-amzn-RequestId,x-amzn-ErrorType,x-amzn-ErrorMessage,Date",
                        # "Content-Length": "79",
                        "Content-Type": "application/x-amz-json-1.1",
                        # "Date": "Пт, 15 Ноя 2024 19:14:19 GMT",
                        "X-Amzn-Errormessage": "Неправильное имя пользователя или пароль.",
                        "X-Amzn-Errortype": "NotAuthorizedException:",
                        "X-Amzn-Requestid": context.aws_request_id
                    }
                }

Я думаю, что функция, которую вы на самом деле ищете, — это включение/выключение пользователей. Нет необходимости создавать собственное решение с использованием триггеров Lambda, это доступно из коробки.

Вы можете использовать API AdminDisableUser для деактивации конкретного пользователя, что предотвращает его вход, что может эффективно стать мягким удалением. Если хотите, вы все равно можете добавить настраиваемый атрибут, чтобы сделать это более явным.

Если вы хотите отменить мягкое удаление, просто используйте AdminEnableUser, чтобы реактивировать его.

Поскольку вы используете Python, вот соответствующая документация boto3:

Ответ или решение

Решение проблемы с NotAuthorizedException в AWS Cognito при использовании Lambda триггеров

При реализации функционала «мягкого удаления» пользователей в AWS Cognito, многие разработчики сталкиваются с необходимостью блокировать попытки входа для «удалённых» пользователей. Эта задача может быть решена с помощью триггера Post Authentication в AWS Lambda. В данной статье обсудим, как правильно настроить этот триггер и избежать таких ошибок, как InvalidLambdaResponseException и NotAuthorizedException.

1. Понимание работы триггеров Cognito

AWS Cognito предоставляет триггеры, которые позволяют интегрировать пользовательскую логику в процессы аутентификации. Триггер Post Authentication позволяет выполнять код после успешного входа пользователя, что удобно для выполнения дополнительных проверок.

2. Ошибки InvalidLambdaResponseException

При работе с триггерами Lambda следует помнить, что функции должны возвращать определённый формат ответа. Если вы попытаетесь вернуть ошибку напрямую (например, через выбрасывание исключения), это приведет к ошибке InvalidLambdaResponseException. В ответах Lambda для триггера Post Authentication не поддерживается возврат статусов или заголовков HTTP.

3. Как обработать мягкое удаление пользователей

Для осуществления контроля за попытками входа для "удалённых" пользователей, сделайте следующее:

  1. Проверьте статус пользователя в вашем пользовательском атрибуте. Если пользователь помечен как "удалён", вы должны вернуть ошибку.
  2. Используйте исключения, но в виде настраиваемого результата для Lambda.

Вот пример кода на Python 3.9, который реализует указанный функционал:

import json

def lambda_handler(event, context):
    # Получаем информацию о пользователе
    user_status = event['request']['userAttributes'].get('custom:user_status')

    # Проверяем, помечен ли пользователь как 'удалённый'
    if user_status == 'deleted':
        raise Exception("NotAuthorizedException: User is marked as deleted.")

    # Если все проверки пройдены, возвращаем результат
    return event

Этот код проверяет пользовательский статус, и если узел с атрибутом custom:user_status имеет значение deleted, он выбрасывает исключение. В Cognito это вызывает NotAuthorizedException, и дальнейший процесс аутентификации будет прекращён.

4. Советы по оптимизации

  • Используйте кастомные атрибуты для хранения состояния пользователя. Это позволит более гибко управлять логикой аутентификации.
  • Обеспечьте вывод логов в AWS CloudWatch, чтобы отслеживать процесс проверки статуса пользователей.
  • Тестируйте вашу Lambda-функцию с использованием различных сценариев, чтобы убедиться, что все возможные исходы корректно обрабатываются.

Заключение

Обработка аутентификации в AWS Cognito через триггеры Lambda требует внимательного подхода к формату ответов. Исключения NotAuthorizedException могут быть выброшены при правильной обработке триггера Post Authentication, учитывая ваш кастомный статус пользователя. Внедрение вышеуказанных практик поможет вам эффективно обрабатывать попытки входа для «удалённых» пользователей, избегая несоответствий и ошибок, таких как InvalidLambdaResponseException.

Оцените материал
Добавить комментарий

Капча загружается...