Apollo 反应阿波罗刷新访问令牌

Apollo 反应阿波罗刷新访问令牌,apollo,access-token,react-apollo,apollo-client,refresh-token,Apollo,Access Token,React Apollo,Apollo Client,Refresh Token,我正在努力在我的应用程序中进行授权。 流程如下-登录时用户接收访问令牌(保存在apollo状态反应变量-accessTokenVAR()中)和刷新令牌(保存在cookie中)。当访问令牌到期时,应该使用刷新令牌刷新它。此外,在apollo client 3.0中,被动VAR不是持久性的,因此在重新加载页面时,需要刷新访问令牌NEDD 我的apollo客户端代码如下: import { useMemo } from 'react'; import { ApolloClient, HttpLink

我正在努力在我的应用程序中进行授权。 流程如下-登录时用户接收访问令牌(保存在apollo状态反应变量-accessTokenVAR()中)和刷新令牌(保存在cookie中)。当访问令牌到期时,应该使用刷新令牌刷新它。此外,在apollo client 3.0中,被动VAR不是持久性的,因此在重新加载页面时,需要刷新访问令牌NEDD

我的apollo客户端代码如下:

import { useMemo } from 'react';
import { ApolloClient, HttpLink } from '@apollo/client';
import { onError } from '@apollo/client/link/error';
import Cookies from 'universal-cookie';
import cache, { accessTokenVAR } from './cache';
import { fromPromise } from '@apollo/client'
import UpdateToken from './Auth';
import { setContext } from '@apollo/client/link/context';

let apolloClient;
const cookies = new Cookies();
const isAuthenticated = cookies.get('token');

const errorLink = onError(
  ({ graphQLErrors, networkError, operation, forward }) => {
    if (graphQLErrors) {
      if (graphQLErrors) {
      graphQLErrors.forEach(({ message }) => {
        if (message === 'Malformed Authorization header') {
            return fromPromise(
              UpdateToken(isAuthenticated)
                .then(({ token, refreshToken }) => {
                  cookies.set('token', refreshToken);
                  accessTokenVAR(token);
                  return token;
                })
                .catch(error => {
                  console.log(error)
                  return;
                })
            ).filter(value => Boolean(value))
             .flatMap(() => {
              // retry the request, returning the new observable
              return forward(operation);
            });
        }
      }
   }
});


const httpLink = new HttpLink({
  uri: 'https://localhost3000/graphql', 
  credentials: 'same-origin' 
});

const authLink = setContext((_, { headers }) =>
  ({
    headers: {
      'content-type': 'application/json',
      ...headers,
      Authorization: accessTokenVAR().length !== 0 ? `Bearer ${accessTokenVAR()}` : null
    }
  })
);


function createApolloClient() {
  return new ApolloClient({
    cache,
    ssrMode: typeof window === 'undefined',
    link: authLink.concat(errorLink).concat(httpLink)
  });
}

export function initializeApollo(initialState = null) {
  const _apolloClient = apolloClient ?? createApolloClient();

  if (initialState) {
    const existingCache = _apolloClient.extract();
    _apolloClient.cache.restore({ ...existingCache, ...initialState });
  }

  if (typeof window === 'undefined') return _apolloClient;

  if (!apolloClient) apolloClient = _apolloClient;

  return _apolloClient;
}

export function useApollo(initialState) {
  const store = useMemo(() => initializeApollo(initialState), [initialState]);
  return store;
}
UpdateToken函数是:

import { accessTokenVAR } from './cache';

const updateToken = async (refreshCookie) => {
  console.log('body', refreshCookie); // eslint-disable-line
  try {
    const urlToken = 'https://localhost/auth/refresh';

    const token = await fetch(urlToken, {
      method: 'POST',
      headers: {
        'content-type': 'application/json'
      },
      body: JSON.stringify({ refresh_token: refreshCookie })
    })
      .then((res) => {
        if (res.status === 404) {
          const error = new Error('user is not exist');
        }
        return res;
      })
      .then((res) => res.json())
      .then((json) => json.token);

    if (!token) {
      console.log(loginError); 
    }
    cookies.set('token', token.refreshToken);
    accessTokenVAR(token.token);
    return token;
  } catch (err) {
    console.log('err.message', err.message); 
    return err;
  }
};

export default updateToken;
似乎从未调用过filter和flatMap。Auth link使用accessTokenVAR()的初始值,但未从errorLink接收。 我需要一些帮助来解决这个问题