К сожалению, AppSync не поддерживает несколько методов аутентификации, и, как вы заметили, интеграция Cognito UserPool требует, чтобы пользователи выполнили вход, прежде чем они смогут получить доступ к конечной точке graphql.
Есть несколько обходных путей, однако ни один из них не настолько хорош:
- Развертывание двух версий - одна с полной функциональностью с использованием UserPools и одна открытая версия с использованием API-ключа (который вы встраиваете в клиент)
- Выполните аутентификацию самостоятельно. Используйте безопасность роли IAM для синхронизации приложений и вместо прямого подключения к конечной точке graphql создайте лямбда-прокси в API-шлюзе, которая либо проверяет пользователей UserPool, либо разрешает ограниченный доступ без учетных данных.
- Создайте пользователя «user» в вашем UserPool с известными (например, в вашем приложении или из конечной точки) учетными данными. Тогда вам придется проверить, является ли ваш пользователь этим пользователем при ответе на защищенные мутации / запросы. Одним из способов сделать это более безопасно может быть добавление пользовательского атрибута «custom: insecure», который вы можете проверить на неоткрытых конечных точках.
- Используйте шаблон просмотра (проверьте реализацию Facebook). Сделайте вашу схему GraphQL открытой по умолчанию (например, известный ключ API), и все ваши запросы / мутации будут принимать первый параметр
viewer
. Это может быть токен доступа, который Cognito возвращает при аутентификации. Затем каждый распознаватель будет отвечать за определение того, является ли токен действительным (например, cognito::getUser
) или доступ разрешен без определения viewer
.
Хотя изначально это звучит как самое сложное, я бы порекомендовал свое первое решение. Существуют способы автоматизации развертываний AppSync, и это делает четкое различие между тем, что открыто, и тем, что защищено в вашей схеме.