Как привязать Cognito Identity ID к политике AWS IoT?

Я пытаюсь установить соединение между AWS IoT и моим приложением React JS.

Я следил за этим руководством (https://medium.com/serverlessguru/serverless-real-time-reactjs-app-aws-iot-mqtt-17d023954045), и мне непонятно, как прикрепить идентификатор Cognito Identity ID к Политика AWS IoT.

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

В статье выше этот процесс выполняется с помощью следующей командной строки:

• Обратите внимание на то, что в этой команде необходимо учитывать "идентификатор_пула".

В документации по aws ( https://aws-amplify.github.io/docs/js/pubsub) говорится, что нужно написать "identity_id "в командной строке:

Когда я использую "identity_pool_id "в командной строке и пытаюсь опубликовать сообщение от AWS IoT, я получаю следующую ошибку:

Когда я использую "identity_id "в командной строке, я могу успешно выполнять обмен данными между AWS IoT и Frontend:

Проблема в том, что "identity_id "- это отдельный код для каждого пользователя. Учитывая, что в моем приложении будет много пользователей, я не знаю, как выполнять эту задачу.

â € Правильно ли я делаю процесс, чтобы рассмотреть "identity_id "вместо "identity_pool_id"?

• Если да, как я могу автоматически прикреплять Cognito ID к политике AWS IoT при каждом входе нового пользователя в мое приложение?

• Есть ли проблема с привязкой тысяч сертификатов Cognito к политике AWS IoT?

2 ответа

Следующий ответ находится в хронологическом порядке, соответствующий 3 вопросам.

  1. Вы можете привязать к политике IoT только identity_id (user). Кроме того, я вижу, что вы использовали API-интерфейс "attach-Principal-policy", который сейчас устарел, поэтому вместо этого используйте AttachPolicy API.
  2. Я не уверен, но все же рекомендую оценить и проверить его на триггере подтверждения сообщения Cognito
  3. Совершенно верно, вы можете привязать политику Интернета вещей к множеству сертификатов; технически это известно как упрощенное управление разрешениями.

Для № 3, соответствующий фрагмент от AWS (см. https://aws.amazon.com/iot-core/faqs/, где найти Q. Что такое упрощенное управление разрешениями?)

"Вы можете использовать одну общую политику для нескольких устройств. Общая политика может использоваться для одной и той же категории устройств вместо создания уникальной политики для каждого устройства. Например, политика, которая ссылается на" серийный номер "в качестве переменной, могут быть подключены ко всем устройствам одной модели. При подключении устройств с одним и тем же серийным номером переменные политики будут автоматически заменены их серийными номерами ".

Я уже некоторое время искал ваш второй вопрос. Вот исправление:

Учитывая, что вы создали политику Интернета вещей, которая предоставляет доступ к службам Интернета вещей, необходимым вашему приложению, можно использовать три различных решения:

  1. Дайiot:AttachPolicyразрешение для предполагаемой роли аутентификации Cognito. В разделе «ресурсы» укажите политику Интернета вещей. В логике вашего приложения для приложения React JS добавьте вызов API после любой успешной аутентификации, чтобы прикрепить политику Интернета вещей к текущему пользователю Cognito, используя идентификатор Cognito Identity ID, к которому у вашего приложения есть доступ.

Недостаток: любой пользователь, подключенный к пулу пользователей, может прикрепить политику Интернета вещей ко всему, что пожелает. Это НЕ рекомендуется AWS. Причина, по которой у нас возникла эта проблема: идентификатор личности недоступен в политике IAM ({cognito-identity.amazonaws.com:sub}ключ для этого не подходит).

  1. Используйте триггеры пост-аутентификации или пост-подтверждения Cognito, чтобы активировать лямбда-функцию, которая прикрепит политику Интернета вещей к новому идентификатору личности, как предложено в предыдущем ответе.

Недостаток: когда срабатывает лямбда-функция (python), кажется, чтоcognito_identity_idв аргументе контекста — None. Причина в том, что событие было инициировано на стороне AWS, а не непосредственно аутентифицированным клиентом приложения React JS... Чтобы исправить это, лямбда-функция может вручную вызвать boto3.CognitoIdentity.Client.list_identitiesи убедитесь, что к каждому объекту прикреплена политика Интернета вещей, но даже с использованиемMaxResultsаргумент, похоже, он не очень хорошо масштабируется...

  1. Лучшим решением, по-видимому, является создание лямбда-функции, которая привязывает политику Интернета вещей к идентификатору личности Cognito, присутствующему в аргументе контекста (context.identity.cognito_identity_id), что можно сделать, если вызов лямбды выполняется вручную приложением React JS после аутентификации. Предполагаемая роль Cognito должна содержать политику сlambda:invokefunctionпрямо на данной лямбде.

Недостаток: лямбда-функция запускается каждый раз при запуске вашего приложения. Но есть решение : перед запуском лямбда-функции ваше приложение может выполнить (бесплатный) вызов API, чтобы проверить, привязана ли уже политика Интернета вещей к его текущему идентификатору Cognito Identity, и если да, отбросить лямбда-вызов. . Для этого не забудьте добавитьiot:ListAttachedPoliciesпрямо в предполагаемой роли Cognito Authenticated.

Другие вопросы по тегам