Я разрабатываю приложение, использующее реагирующий натив, с Expo, которое взаимодействует с BackQL-сервером GraphQL с помощью Apollo.
Авторизация между Front и Back выполняется с помощью токена JWT для заголовка, и он работает нормально. В бэкэнде есть промежуточное ПО, которое проверяет, существует ли токен и является ли он действительным:
- Если запрос открыт, он просто получает информацию.
- Если запрос авторизован и пользователь аутентифицирован, он получает информацию.
- Если запрос авторизован, но пользователь не авторизован (или использует недопустимый токен), он выдает ошибку.
BACKEND
export const isAuth: MiddlewareFn<MyContext> = ({ context }, next) => {
const { authorization } = context.req.headers;
if (!authorization) {
throw new Error("Not authenticated. ");
}
[...]
}
@Query(() => User)
@UseMiddleware(isAuth)
async Me(
@Ctx() { payload }: MyContext,
) {
return UserModel.findById(payload!.userId);
}
Я получаю запросы через следующий компонент:
FRONTEND
const Me: React.FC<any> = (props) => {
const {
data, loading, error,
} = useMeQuery();
if (loading) {
return (<Text>Loading ... {String(props.test)}</Text>);
}
if (error) {
return (<Text>{ error.message } {String(props.test)}</Text>);
}
return (
<Text>Hello { String(data?.Me?.email) } </Text>
);
};
Существо useMeQuery();
хук-функция, сгенерированная @graphql-codegen/cli
.
export function useMeQuery(baseOptions?: ApolloReactHooks.QueryHookOptions<MeQuery, MeQueryVariables>) {
return ApolloReactHooks.useQuery<MeQuery, MeQueryVariables>(MeDocument, baseOptions);
}
До этого все работало нормально.
Теперь я пытаюсь реализовать функцию выхода из системы на внешнем интерфейсе, чтобы пользователь мог продолжать навигацию как анонимный пользователь при выходе из системы.
Я только что создал кнопку, которая вызывает функцию, которая очищает сохраненные токены (она работает), поэтому следующие вызовы не проходят проверку подлинности и выдают ошибку. Проблема, с которой я сталкиваюсь, состоит в том, что apollo-client использует кеш для повторной обработки запроса, поэтому теперь анонимный пользователь может видеть информацию о пользователях старого LogedIn.
Для выхода из системы я попытался несколько способы очистки кеша, но безуспешно:
clearTokens(); // Clear tokens from asyncStorage. Working fine.
// Tying to clear cache:
client.clearStore(); // Not working, still getting the stored value on cache when refreshing the component.
client.cache.reset(); // Not working, still getting the stored value on cache when refreshing the component.
client.resetStore(); // Not working, it tries to call the query again, it throws an error (because it is not authenticated) and doesn't clear the cache.
Какой самый лучший способ для выхода из системы при использовании apollo-client
?
PD: Если вошел другой пользователь, я вызываю client.resetStore();
и запросы все переписаны, работают нормально. Проблема в том, чтобы просто перейти от loggedIn к анонимному.