Skip to content

Commit 71bd690

Browse files
authored
Merge pull request #190 from DguFarmSystem/feat/#186
feat: accessToken을 localStorage 대신 Zustand 상태로 관리하도록 변경
2 parents 073db40 + 3e95576 commit 71bd690

File tree

4 files changed

+76
-56
lines changed

4 files changed

+76
-56
lines changed

apps/farminglog/src/pages/auth/SocialRedirect.tsx

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect } from "react";
1+
import { useRef, useEffect, useMemo } from "react";
22
import { useNavigate, useSearchParams } from "react-router";
33
import { useSocialLoginPostMutation } from "@repo/auth/services/mutation/useSocialLoginPostMutation";
44

@@ -7,42 +7,58 @@ export default function SocialRedirect() {
77
const navigate = useNavigate();
88
const { mutate: login, status } = useSocialLoginPostMutation();
99

10-
1110
const isLoading = status === "pending";
1211

13-
useEffect(() => {
14-
const code = params.get("code");
15-
const provider = (params.get("state") || params.get("provider"))?.toUpperCase() as "KAKAO" | "GOOGLE";
12+
const isCalled = useRef(false); // 한 번만 호출되도록
13+
14+
15+
const code = useMemo(() => params.get("code"), [params]);
16+
const provider = useMemo(() => {
17+
const raw = params.get("state") || params.get("provider");
18+
return raw?.toUpperCase() as "KAKAO" | "GOOGLE" | undefined;
19+
}, [params]);
1620

21+
useEffect(() => {
1722
if (!code || (provider !== "KAKAO" && provider !== "GOOGLE")) {
18-
console.error("소셜 로그인 파라미터 누락 또는 잘못됨");
23+
// console.error("소셜 로그인 파라미터 누락 또는 잘못됨");
1924
navigate("/?error=invalid_params");
2025
return;
2126
}
2227

28+
isCalled.current = true;
29+
2330
login(
2431
{ code, socialType: provider },
2532
{
2633
onSuccess: () => {
2734
navigate("/home");
2835
},
29-
onError: (error: any) => {
30-
const status = error?.response?.status;
31-
32-
if (status === 404) {
33-
navigate("/?status=not-member&type=404", { replace: true });
34-
} else if (status === 409) {
35-
navigate("/?status=not-member&type=409", { replace: true });
36-
} else if (status === 500) {
37-
navigate("/?status=not-member&type=500", { replace: true });
38-
} else {
39-
navigate("/?error=unknown", { replace: true });
40-
}
41-
},
36+
onError: (error: any) => {
37+
const status = error?.response?.status;
38+
// console.error("소셜 로그인 에러:", error);
4239

40+
if (!status) {
41+
navigate("/?error=network_or_unknown", { replace: true });
42+
return;
43+
}
44+
45+
switch (status) {
46+
case 404:
47+
navigate("/?error=not-found", { replace: true });
48+
break;
49+
case 409:
50+
navigate("/?error=conflict", { replace: true });
51+
break;
52+
case 500:
53+
navigate("/?error=server-error", { replace: true });
54+
break;
55+
default:
56+
navigate("/?error=unknown", { replace: true });
57+
}
58+
},
4359
}
4460
);
45-
}, [params, login, navigate]);
61+
}, [code, provider, login, navigate]);
4662

4763
return (
4864
<div style={{ textAlign: "center", marginTop: "4rem" }}>
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import Cookies from "js-cookie";
2+
import { useAuthStore } from "../../auth/stores/useAuthStore";
23

34
export const getClientSideTokens = () => {
5+
const accessToken = useAuthStore.getState().accessToken;
6+
const refreshToken = Cookies.get("refreshToken") || "";
7+
48
return {
5-
accessToken: localStorage.getItem("accessToken") || "",
6-
refreshToken: Cookies.get("refreshToken") || "",
9+
accessToken: accessToken || "",
10+
refreshToken,
711
};
812
};

packages/auth/services/mutation/useSocialLoginPostMutation.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,25 @@ interface TokenResponse {
1515

1616
export const useSocialLoginPostMutation = () => {
1717
const { post } = usePublicApi();
18-
const { studentId, setToken } = useAuthStore();
18+
const studentId = useAuthStore((state) => state.studentId);
19+
const setToken = useAuthStore((state) => state.setToken);
1920

2021
const mutation = useMutation<TokenResponse, Error, SocialLoginRequest>({
2122
mutationFn: async ({ code, socialType }) => {
22-
2323
const { data, status } = await post<TokenResponse>("/auth/login", {
2424
code,
2525
socialType,
26-
studentNumber: studentId,
26+
studentNumber: studentId,
2727
});
2828

2929
if (status !== 200) throw new Error("로그인 실패");
3030

3131
const { accessToken, refreshToken } = data;
3232

33-
setToken(accessToken);
34-
33+
setToken(accessToken); // 여기서 더 이상 에러 안 남
34+
3535
//refreshToken: js-cookie 저장 (HttpOnly 아니여서 추후에 보안 조치 필요)
36+
3637
Cookies.set("refreshToken", refreshToken, {
3738
secure: true,
3839
sameSite: "Strict",
Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { create } from 'zustand';
2-
import { persist, combine } from 'zustand/middleware';
2+
import { combine } from 'zustand/middleware';
33

44
type AuthStep =
55
| 'start'
@@ -14,37 +14,36 @@ interface AuthState {
1414
studentId: string;
1515
userName: string;
1616
errorMessage: string | null;
17-
errorTitle: string | null;
17+
errorTitle: string | null;
18+
accessToken?: string;
1819
}
1920

2021
export const useAuthStore = create(
21-
persist(
22-
combine<AuthState, any>(
23-
{
24-
step: 'start',
25-
studentId: '',
26-
userName: '',
27-
errorMessage: null,
28-
errorTitle: null,
29-
},
30-
(set) => ({
31-
setStep: (step: AuthStep) => set({ step }),
32-
setStudentId: (studentId: string) => set({ studentId }),
33-
setUserName: (userName: string) => set({ userName }),
34-
setErrorMessage: (msg: string | null) => set({ errorMessage: msg }),
35-
setErrorTitle: (title: string | null) => set({ errorTitle: title }),
36-
reset: () =>
37-
set({
38-
step: 'start',
39-
studentId: '',
40-
userName: '',
41-
errorMessage: null,
42-
}),
43-
})
44-
),
22+
combine<AuthState, any>(
4523
{
46-
name: 'auth-storage',
47-
partialize: (state) => ({ studentId: state.studentId }),
48-
}
24+
step: 'start',
25+
studentId: '',
26+
userName: '',
27+
errorMessage: null,
28+
errorTitle: null,
29+
accessToken: undefined,
30+
},
31+
(set) => ({
32+
setStep: (step: AuthStep) => set({ step }),
33+
setStudentId: (studentId: string) => set({ studentId }),
34+
setUserName: (userName: string) => set({ userName }),
35+
setErrorMessage: (msg: string | null) => set({ errorMessage: msg }),
36+
setErrorTitle: (title: string | null) => set({ errorTitle: title }),
37+
setToken: (token: string) => set({ accessToken: token }),
38+
reset: () =>
39+
set({
40+
step: 'start',
41+
studentId: '',
42+
userName: '',
43+
errorMessage: null,
44+
errorTitle: null,
45+
accessToken: undefined,
46+
}),
47+
})
4948
)
5049
);

0 commit comments

Comments
 (0)