Apollo 反应阿波罗刷新访问令牌
我正在努力在我的应用程序中进行授权。 流程如下-登录时用户接收访问令牌(保存在apollo状态反应变量-accessTokenVAR()中)和刷新令牌(保存在cookie中)。当访问令牌到期时,应该使用刷新令牌刷新它。此外,在apollo client 3.0中,被动VAR不是持久性的,因此在重新加载页面时,需要刷新访问令牌NEDD 我的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
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接收。
我需要一些帮助来解决这个问题