Как получить авторизованного пользователя для вызова PostText API во время выполнения бота Lex - PullRequest
0 голосов
/ 13 июня 2018

Извините за длинный пост.Я пытаюсь вызвать бота Lex с API времени выполнения PostText с моей лямбда-функцией.Однако, когда я проверяю этот вызов, он возвращает, что userID не авторизован для использования этого.Это сообщение об ошибке, которое я получаю:

    Response:
{
  "errorMessage": "An error occurred (AccessDeniedException) when calling the PostText operation: User: arn:aws:sts::981709171824:assumed-role/lambda_basic_execution/OrchestratorAPIApp is not authorized to perform: lex:PostText on resource: arn:aws:lex:us-east-1:981709171824:bot:SupportBot_BookCab:SupportBot_BookCab",
  "errorType": "ClientError",
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      18,
      "lambda_handler",
      "inputText= userInput"
    ],
    [
      "/var/runtime/botocore/client.py",
      314,
      "_api_call",
      "return self._make_api_call(operation_name, kwargs)"
    ],
    [
      "/var/runtime/botocore/client.py",
      612,
      "_make_api_call",
      "raise error_class(parsed_response, operation_name)"
    ]
  ]
}

Request ID:
"677f1820-6ed2-11e8-b891-33ab1951c65f"

Function Logs:
START RequestId: 677f1820-6ed2-11e8-b891-33ab1951c65f Version: $LATEST
An error occurred (AccessDeniedException) when calling the PostText operation: User: arn:aws:sts::981709171824:assumed-role/lambda_basic_execution/OrchestratorAPIApp is not authorized to perform: lex:PostText on resource: arn:aws:lex:us-east-1:981709171824:bot:SupportBot_BookCab:SupportBot_BookCab: ClientError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 18, in lambda_handler
    inputText= userInput
  File "/var/runtime/botocore/client.py", line 314, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 612, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the PostText operation: User: arn:aws:sts::981709171824:assumed-role/lambda_basic_execution/OrchestratorAPIApp is not authorized to perform: lex:PostText on resource: arn:aws:lex:us-east-1:981709171824:bot:SupportBot_BookCab:SupportBot_BookCab

END RequestId: 677f1820-6ed2-11e8-b891-33ab1951c65f
REPORT RequestId: 677f1820-6ed2-11e8-b891-33ab1951c65f  Duration: 325.25 ms Billed Duration: 400 ms     Memory Size: 128 MB Max Memory Used: 31 MB  

Это мой код вызова API:

    import boto3

def lambda_handler(event, context):
    responderName = event["DestinationBot"]
    userId = event["RecipientID"]
    userInput = event["message"]["text"]

    client = boto3.client('lex-runtime')

    response = client.post_text(
        botName=responderName,
        botAlias=responderName,
        userId=userId,
        sessionAttributes={
        },
        requestAttributes={
        },
        inputText= userInput
    )

Это мой пример тестового ввода:

{
  "DestinationBot": "SupportBot_BookCab",
  "RecipientID": "12345",
  "message": {
      "text": "book me a cab"
  }
}

1 Ответ

0 голосов
/ 18 июня 2018

userID из PostText - это способ продолжения беседы между пользователем и Лексом.Это может быть что угодно, что вы можете идентифицировать пользователя в его входящем запросе, который является непротиворечивым и уникальным для него, по крайней мере, для этого сеанса.

От Документы AWS PostText:

userID
Идентификатор пользователя клиентского приложения.Amazon Lex использует это для идентификации разговора пользователя с вашим ботом.Во время выполнения каждый запрос должен содержать поле userID.
...
Ограничения длины: минимальная длина 2. Максимальная длина 100.
Шаблон: [0-9a-zA-Z ._: -] +

Поэтому, если пользователь использует мессенджер Facebook, у него будет идентификатор Facebook, который передается с его сообщениями, и вы можете использовать его в качестве userID.
Если пользовательс помощью Twilio-SMS им будет передан номер телефона с их сообщениями, и вы можете использовать его в качестве userID.

Ваш код в настоящее время принимает event["RecipientID"] и использует его как userID.Но RecipientID из входящего сообщения - это вы, получатель входящего сообщения.

Ваша ошибка говорит вам, что

... Пользователь: arn: aws: sts:: XXXXXXXXXX: предполагаемая роль / lambda_basic_execution / OrchestratorAPIApp

Так что userID = event["RecipientID"] = 'arn:aws:sts::XXXXXXXX:assumed-role/lambda_basic_execution/OrchestratorAPIApp'

Вы определенно не хотите, чтобы идентификатор получателя былиспользуется.

Вместо этого вы хотите, чтобы идентификатор отправителя был userID.Примерно так:

userId = event [" Отправитель ID"]

Это может быть не тот код, который вы используете, это всего лишь пример,Вы должны быть в состоянии просмотреть входящий запрос и найти там что-нибудь, чтобы использовать его в качестве правильного идентификатора пользователя, как я объяснил выше для Facebook и Twilio.

...