@graphql_ru
GraphQL — русскоговорящее сообщество

Общаемся на темы, посвященные GraphQL и опыту его использования. Проблемы. Новости. Решения. Вам могут быть полезны: @apollo_ru, @react_js, @vuejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание в чате было полезным и комфортным.

352 members

Архив канала @graphql_ru 9 августа 2017 г.

06:54:28 ПП
User 249356274
Всем привет. У меня такое ощущение что изобрели хороший инструмент, но он как-то не очень популярен. Сейчас каждый второй пишет на реакте, вью, ангуляре и все до сих пор используют rest? На github, дальше простых примеров с запросами и мутациями никто не делает. Меня лично волнует, то что очень мало инфы про авторизацию и аутентификацию пользователей. Например, на странице авторизации отправлять запрос или делать мутацию. А потом полученный токен отправлять в хедере или же параметром? Может есть здесь кто опытный? И сможет ответить хотя бы на эти вопросы?
06:55:36 ПП
User 35318732
выноси авторизацию во вне
06:55:42 ПП
User 35318732
так проще имхо
06:56:07 ПП
User 35318732
http://dev.apollodata.com/react/auth.html
06:56:36 ПП
User 35318732
в запросе каждом просто добавляй токен юзера
06:59:00 ПП
User 35318732
на бэке прежде чем обрабатывать запрос - тащи юзера по токену и закидывай айди в request, в resolve - функции запроса у тебя один из аргументов - это request и там ты уже сможешь определить че за юзер
06:59:31 ПП
User 249356274
User 35318732
так проще имхо
Кстати да, есть и такой вариант. Но чем он лучше? Почему все не сделать в одном месте?)
07:00:10 ПП
User 35318732
так исторически сложилось (с)
07:01:33 ПП
User 35318732
ну тебе так надо будет в каждом запросе тащить из заголовков токен, потом по нему смотреть в редисе что за юзер и тд и тп - выносишь в отдельную мидлвару а в графкуэле уже пользуешься результатом, не зря умы придумали мидлварную архитектуру)
07:05:46 ПП
User 35318732
а про то что, логин/логаут - отдельно, остальные запросы отдельно - ну тут хз, можно конечно, делать query user {  ... } и если 401 - mutation login (user, pass) { id, name, ... }
07:07:23 ПП
User 35318732
если с нуля писать - наверно лучше,
ну я вот встраиваю в существующее кусок - там авторизация уже напилена, там получается только пробрасывать токен в запросы
07:07:30 ПП
User 141958411
User 35318732
а про то что, логин/логаут - отдельно, остальные запросы отдельно - ну тут хз, можно конечно, делать query user {  ... } и если 401 - mutation login (user, pass) { id, name, ... }
а где у apollo отлавливать 401?
07:07:43 ПП
User 35318732
errors же
07:07:58 ПП
User 141958411
там вроде кода ошибки нет
07:08:32 ПП
User 35318732
а ну да, там же типа 200 всегда, ну можно в теле отправить 401))
07:08:46 ПП
User 35318732
вот-вот, про то, что проще авторизацию отдельно))
07:09:33 ПП
User 249356274
User 35318732
а про то что, логин/логаут - отдельно, остальные запросы отдельно - ну тут хз, можно конечно, делать query user {  ... } и если 401 - mutation login (user, pass) { id, name, ... }
Просто по сути чтобы получить токен - надо его создать. Вроде как мутация подходит, так же и с логаут - удаление (сброс) токена.
07:10:23 ПП
User 141958411
User 249356274
Просто по сути чтобы получить токен - надо его создать. Вроде как мутация подходит, так же и с логаут - удаление (сброс) токена.
по идее достаточно удалить Header для logout мутация не нужна
07:11:06 ПП
User 141958411
ну и очистить store
07:11:42 ПП
User 35318732
User 249356274
Просто по сути чтобы получить токен - надо его создать. Вроде как мутация подходит, так же и с логаут - удаление (сброс) токена.
а если у тебя вторая вкладка открыта - токен то создан, если создашь - будет 2 токена? тут надо тащить user { token } и его результат пробросить в клиента тогда?
07:12:07 ПП
User 35318732
хз кароч как-то странно)
07:17:06 ПП
User 249356274
А разве localStorage доступен не на всех вкладках? Просто перед каждым запросом добавлять токен в заголовок. На второй вкладке уйдёт мутация уже с токеном. В этом случае просто не создавать новый, а отправить существующий. Или вообще выбросить ошибку. Разве не так? Отдельные маршруты для логина в этом случае могут иметь такую же проблему вроде как
07:20:32 ПП
User 35318732
я может тебя не так понял, думал ты хочешь на старте всегда делать мутацию "создай токен"
07:22:00 ПП
User 141958411
User 249356274
А разве localStorage доступен не на всех вкладках? Просто перед каждым запросом добавлять токен в заголовок. На второй вкладке уйдёт мутация уже с токеном. В этом случае просто не создавать новый, а отправить существующий. Или вообще выбросить ошибку. Разве не так? Отдельные маршруты для логина в этом случае могут иметь такую же проблему вроде как
да, такой подход и предалгают relay и apollo  и проблем с двумя вкладками тут не будет. Но вообще это нормальная практика при каждом запросе из localStorage тащить токен, может его где нибудь в оперативной памяти хранить, а в нее загружать из localStorage при старте приложения?
07:22:31 ПП
User 249356274
User 35318732
я может тебя не так понял, думал ты хочешь на старте всегда делать мутацию "создай токен"
Я имел в виду на странице с формой входа отправлять мутацию)
07:23:40 ПП
User 35318732
User 141958411
а где у apollo отлавливать 401?
networkInterface.useAfter([
  {
    applyAfterware({ response }, next) {
      if (response.status === 401) {
        store.dispatch(catch401());
      } else {
        next();
      }
    },
  },
]);

вот в моем случае 401 на сервере бросается первой мидлварой в экспрессе, которая отвечает за авторизацию/аутентификацию и до графкюэлевских обработчиков дело даже не доходит на серваке
а на клиенте словить вот так можно
07:28:03 ПП
User 249356274
User 141958411
да, такой подход и предалгают relay и apollo  и проблем с двумя вкладками тут не будет. Но вообще это нормальная практика при каждом запросе из localStorage тащить токен, может его где нибудь в оперативной памяти хранить, а в нее загружать из localStorage при старте приложения?
Если я правильно понимаю, то в таком случае при устаревшем токене новые данные просто не вернуться. Тогда либо показываем форму входа, либо если есть долгоживущий рефреш токен, то отправляем запрос на обновление аксесс токена. И потом снова шлем запрос с обновлённым токеном (где-то на хабре что-то подобное было описано)
07:29:06 ПП
User 141958411
User 35318732
networkInterface.useAfter([
  {
    applyAfterware({ response }, next) {
      if (response.status === 401) {
        store.dispatch(catch401());
      } else {
        next();
      }
    },
  },
]);

вот в моем случае 401 на сервере бросается первой мидлварой в экспрессе, которая отвечает за авторизацию/аутентификацию и до графкюэлевских обработчиков дело даже не доходит на серваке
а на клиенте словить вот так можно
да, это работает. Спасибо
07:29:32 ПП
07:30:10 ПП
User 249356274
Ну за разбор небольшого беспорядка в моей голове - всем спасибо) Просто тяжело перестроится, когда постоянно делал авторизацию через кукисы и сессии)))
07:30:39 ПП
User 35318732
так а че в итоге выбрал?)
07:31:54 ПП
User 141958411
User 249356274
Ну за разбор небольшого беспорядка в моей голове - всем спасибо) Просто тяжело перестроится, когда постоянно делал авторизацию через кукисы и сессии)))
есть мнение что token должен быть в кукисах
http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
с apollo можно и в кукисах передавать jwt
07:38:52 ПП
User 249356274
User 141958411
есть мнение что token должен быть в кукисах
http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
с apollo можно и в кукисах передавать jwt
Теоретически можно токен хранить и в куках, вместо локал сторадж. Просто тогда мы на клиенте ограничиваемся, только именем домена. Не проверял, утверждать точно не могу) Я на данный момент пишу бэкхенд на PHP и при желании можно использовать авторизацию с помощью сессий и вообще не нужно хранить токен))))
07:39:39 ПП
User 141958411
User 249356274
Теоретически можно токен хранить и в куках, вместо локал сторадж. Просто тогда мы на клиенте ограничиваемся, только именем домена. Не проверял, утверждать точно не могу) Я на данный момент пишу бэкхенд на PHP и при желании можно использовать авторизацию с помощью сессий и вообще не нужно хранить токен))))
да, в этом плане GraphQL никак не ограничивает
07:40:43 ПП
User 249356274
User 35318732
так а че в итоге выбрал?)
Думаю попробовать с мутациями сделать. Надо тестовый проект сделать))) Сейчас пока сложно всю картину в уме держать, на бумагу нужно перенести)
07:43:15 ПП
User 35318732
у тебя так в дополнение к сущностям твоей бизнес логики добавляются еще мусорные сущности, необходимые только для адекватной работы приложения - это я про токены, я бы на твоем месте жил с сессиями и не парился)
07:47:58 ПП
User 249356274
User 35318732
у тебя так в дополнение к сущностям твоей бизнес логики добавляются еще мусорные сущности, необходимые только для адекватной работы приложения - это я про токены, я бы на твоем месте жил с сессиями и не парился)
С сессиями проще, потому что куки автоматически передаются в запросе, а с токеном нужно самому его в запрос вставлять. Но если приложение и бэкенд на разных доменах, то этот механизм уже работать не будет. И в этом случае для сторонних приложений надо будет писать 2 метода авторизации
07:49:39 ПП
User 249356274
Ну а graphql все таки хорошая штука)