
Я использую GraphQl более 2 месяцев и до сих пор не уверен, лучше ли он, чем традиционный REST Apis, но это был хороший опыт. Это действительно помогло мне отделить клиента от серверной части, поскольку нет такой суеты с созданием пользовательских конечных точек для каждой страницы.
Сначала у меня возникла небольшая проблема, когда я использовал jwt для авторизации своих пользователей как GraphQl, в отличие от традиционных API-интерфейсов rest, которые имеют только ограниченные конечные точки, в большинстве случаев не более одной, и поэтому было сложно найти способ создать промежуточное программное обеспечение для аутентификации запросы. Наконец я нашел способ, и теперь, когда он работает хорошо, я подумал поделиться им со всеми вами.
У меня есть базовая настройка приложения GraphQl nodejs. Я использую firebase для аутентификации пользователей из таких приложений, как facebook и gmail, поэтому в моей пользовательской модели я просто сохраняю uid firebase.
Вот как выглядит мой app.js
Как видите, я создал две конечные точки GraphQl, в одной из которых есть промежуточное программное обеспечение, а в другой - нет, потому что другого способа отличить их нет. Я создал два разных резолвера для каждого, то есть rootResolver и rootAuthResolver.
Вот мой файл резолверов index.js.
Теперь перейдем к промежуточному программному обеспечению. Ниже мой файл auth.js.
Как видите, мы ожидаем, что клиент передаст токен аутентификации JWT через заголовок с ключом «x-auth-token», после чего я найду пользователя, использующего этот токен JWT.
Теперь вернемся к нашему app.js,
Я импортировал auth и передал его как параметр app.use. Теперь, прежде чем перейти к преобразователю GraphlQl, наш запрос сначала пройдет через auth.js, и он проверит пользователя и сохранит его данные в req как req.user, которые мы позже можем использовать в любой из резолверов. Например, я создал распознаватель пользователей, который будет просто запросом и вернет пользовательские данные.
Как вы можете видеть, у нас есть переменная по имени contest, которая будет содержать все данные req, и, как и в нашем auth.js, мы добавили данные пользователя в req, мы можем получить то же самое здесь, в нашем преобразователе.
GraphQl хорошо себя зарекомендовал, и если вы хотите переключиться на него, я бы порекомендовал сделать это как можно скорее :)