AppSync GraphQL Подписка на групповые данные

Я реализовал уровень авторизации AWS Lambda для моих запросов и изменений GraphQL, так что пользователь может только читать / записывать данные в конкретный элемент таблицы DynamoDB, если он является членом группы, к которой принадлежит элемент, реализовано с использованием раздела groupId key и ключ сортировки itemId. Так что в таблице может быть много itemId с общим groupId, а также много разных groupId. Все работает так, как ожидалось.

Теперь я хотел бы иметь возможность распространить эту групповую авторизацию на мои подписки GraphQL в реальном времени. Я наблюдаю, что неограниченные подписки транслируются для всех пользователей. Мне нужно решение, которое ограничивает события подписки таким образом, чтобы все члены группы и только члены группы получали событие подписки для мутаций табличных данных, содержащих соответствующий ключ groupID. Пользователь, являющийся членом многих групп, будет получать события подписки для всех групп, членом которых он является.

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

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

Я использую API AWS Amplify для клиентских вызовов GraphQL. Я заметил, что у Apollo есть subscribeToMore (), который может быть полезен для этого сценария, но в настоящее время я предпочитаю держаться подальше от доработки, необходимой мне, чтобы приспособить мой пользовательский интерфейс к шаблону Render Props Apollo 2.

Есть предположения?


person LeanTide    schedule 09.05.2018    source источник


Ответы (1)


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

  1. Добавьте в свою подписку аргумент groupId.
  2. Прикрепите к своей подписке преобразователь подписки.
  3. В шаблоне сопоставления запросов преобразователя подписки запросите таблицу User, чтобы определить, для каких групп вызывающий абонент авторизован.
  4. В шаблоне сопоставления ответа подписки сверьте аргумент подписки "groupId" со списком групп, полученным из запроса таблицы пользователя. Отклоните запрос, если вызывающий абонент пытается подписаться на группу, для которой он не авторизован.
  5. Убедитесь, что ваша мутация возвращает поле groupId, чтобы подписки AppSync могли правильно маршрутизировать ваши сообщения.

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

Вот документация по авторизации подписки, которая содержит пример, похожий на ваш: https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html#real-time-data

person Michael Willingham    schedule 21.05.2018