-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuse-auth.ts
67 lines (53 loc) · 1.44 KB
/
use-auth.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import {
ACCESS_TOKEN_KEY,
END_POINT,
REFRESH_TOKEN_KEY,
} from '~/constants/api';
import type { Tokens } from '~/hooks/use-sign-in';
import { getToken, removeTokens } from '~/utils/api';
import { http } from '~/utils/http';
import { decodeJwt } from '~/utils/jwt';
const useAuth = () => {
const setTokens = (tokens: Tokens) => {
if (!tokens.accessToken || !tokens.refreshToken) {
console.log('토큰이 존재하지 않음');
return;
}
localStorage.setItem(ACCESS_TOKEN_KEY, tokens.accessToken);
localStorage.setItem(REFRESH_TOKEN_KEY, tokens.refreshToken);
const decoded = decodeJwt(tokens.accessToken);
if (!decoded || !decoded.exp) {
console.log('잘못된 jwt 토큰');
return;
}
const expiresIn = decoded.exp * 1000 - Date.now();
if (expiresIn <= 0) {
logout();
return;
}
setTimeout(() => {
logout();
}, expiresIn);
};
const refreshTokens = async () => {
const [accessToken, refreshToken] = getToken();
if (!accessToken || !refreshToken) {
logout();
return;
}
try {
const newTokens = await http
.post(END_POINT.REISSUE, { json: { accessToken, refreshToken } })
.json<Tokens>();
setTokens(newTokens);
} catch (error) {
console.log(error);
logout();
}
};
const logout = () => {
removeTokens();
};
return { setTokens, logout, refreshTokens };
};
export { useAuth };