store/auth использует токен из зустанда

This commit is contained in:
krokodilka 2023-05-08 17:34:50 +03:00
parent 18029e8133
commit 751c962480
2 changed files with 8 additions and 10 deletions

@ -6,7 +6,7 @@ import Logo from "../../Logo";
import { authStore } from "@root/stores/auth"; import { authStore } from "@root/stores/auth";
const Header: React.FC = () => { const Header: React.FC = () => {
const { makeRequest } = authStore(); const { makeRequest, clearToken } = authStore();
return ( return (
<React.Fragment> <React.Fragment>
<Box <Box
@ -55,7 +55,7 @@ const Header: React.FC = () => {
makeRequest({ makeRequest({
url: "https://admin.pena.digital/auth/logout", url: "https://admin.pena.digital/auth/logout",
contentType: true, contentType: true,
}).then(() => localStorage.setItem("AT", "")); }).then(() => clearToken());
}} }}
sx={{ sx={{
display: "flex", display: "flex",

@ -1,6 +1,6 @@
import axios, { AxiosError, AxiosResponse } from "axios"; import axios, { AxiosError, AxiosResponse } from "axios";
import { create } from "zustand"; import { create } from "zustand";
import { devtools } from "zustand/middleware"; import { persist } from "zustand/middleware";
type Token = string; type Token = string;
@ -22,7 +22,7 @@ interface FirstRequest<T> {
} }
export const authStore = create<AuthStore>()( export const authStore = create<AuthStore>()(
devtools( persist(
(set, get) => ({ (set, get) => ({
token: "", token: "",
setToken: (newToken) => set({ token: newToken }), setToken: (newToken) => set({ token: newToken }),
@ -56,7 +56,6 @@ async function makeRequest<TRequest, TResponse>({
token, token,
}: MakeRequest<TRequest>) { }: MakeRequest<TRequest>) {
//В случае 401 рефреш должен попробовать вызваться 1 раз //В случае 401 рефреш должен попробовать вызваться 1 раз
let counterRefresh = true;
let headers: any = {}; let headers: any = {};
if (useToken) headers["Authorization"] = bearer ? "Bearer " + token : token; if (useToken) headers["Authorization"] = bearer ? "Bearer " + token : token;
if (contentType) headers["Content-Type"] = "application/json"; if (contentType) headers["Content-Type"] = "application/json";
@ -79,10 +78,9 @@ async function makeRequest<TRequest, TResponse>({
} catch (nativeError: unknown) { } catch (nativeError: unknown) {
const error = nativeError as AxiosError; const error = nativeError as AxiosError;
if (error?.response?.status === 401 && counterRefresh) { if (error?.response?.status === 401) {
const refreshResponse = await refresh(); const refreshResponse = await refresh(token);
if (refreshResponse.data?.accessToken) HC(refreshResponse.data.accessToken); if (refreshResponse.data?.accessToken) HC(refreshResponse.data.accessToken);
counterRefresh = false;
headers["Authorization"] = refreshResponse.data.accessToken; headers["Authorization"] = refreshResponse.data.accessToken;
const response = await axios<TRequest, AxiosResponse<TResponse>>({ url, method, headers, data: body, signal }); const response = await axios<TRequest, AxiosResponse<TResponse>>({ url, method, headers, data: body, signal });
@ -94,10 +92,10 @@ async function makeRequest<TRequest, TResponse>({
} }
} }
function refresh() { function refresh(token:Token) {
return axios<never, AxiosResponse<{ accessToken: string }>>("https://admin.pena.digital/auth/refresh", { return axios<never, AxiosResponse<{ accessToken: string }>>("https://admin.pena.digital/auth/refresh", {
headers: { headers: {
Authorization: localStorage.getItem("AT"), Authorization: token,
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
}); });