Apollo resetStore не работает в клиенте Angular

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

Вот мой код app.module.ts

const networkInterface = createNetworkInterface({
  uri: "http://localhost:3000/graphql"
});

networkInterface.use([
  {
    applyMiddleware(req, next) {
      if (!req.options.headers) {
        req.options.headers = {}; // Create the header object if needed.
      }

      req.options.headers.authorization = localStorage.getItem(AUTH_TOKEN);
      next();
    }
  }
]);

export function provideClient(): ApolloClient {
  return new ApolloClient({
    networkInterface,
    dataIdFromObject: (o: any) => `${o.__typename}-${o.id},`
  });
}

Когда я выхожу из системы, у меня есть этот код

localStorage.removeItem(AUTH_TOKEN);
this._apollo.getClient().resetStore(); 

Затем, когда я делаю еще один запрос, он все еще принимает старый токен в заголовках запроса.

Как я могу обновить это с помощью нового токена?


person Dk Kumar    schedule 13.09.2017    source источник


Ответы (1)


Я мог бы изменить промежуточное ПО на это:

networkInterface.use([{
    applyMiddleware(req, next) {
        if (!req.options.headers) req.options.headers = {}
        const token = localStorage.getItem('token')
        req.options.headers.authorization = token ? token : null
        next()
    }
}])

Обратите внимание на тернарный оператор token ? token : null. Это гарантирует, что заголовок аутентификации не может быть отправлен, если приложение не знает токен. Если ваш клиент все еще отправляет его, значит, токен не удаляется должным образом.

Вы также можете попробовать этот быстрый тест: после выхода из системы нажмите F12 и введите в консоли браузера: localStorage и посмотрите, там ли еще токен.

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

Добавить токен: localStorage.setItem('token', 'e47nes45nysde5nue5nu')

Удалить токен: localStorage.removeItem('token')

Если ваш код выглядит так:

const AUTH_TOKEN = 'e47nes45nysde5nue5nu'
localStorage.removeItem(AUTH_TOKEN)

Тогда вот почему он все еще выполняет запросы с токеном аутентификации. Я не думаю, что он генерирует ошибки в консоли, если не находит подходящий ключ для удаления из localStorage.

person agm1984    schedule 20.09.2017