Skip to content

Commit a9f5fea

Browse files
authored
Merge pull request #182 from CSE-Shaco/develop
hotfix(auth): ApiCodeGuard 내 refresh 및 권한 검증 로직 수정
2 parents c87002a + 0d880ef commit a9f5fea

File tree

1 file changed

+12
-19
lines changed

1 file changed

+12
-19
lines changed

src/components/auth/ApiCodeGuard.jsx

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import Loader from '@/components/ui/common/Loader';
77

88
/**
99
* ApiCodeGuard
10-
* - /auth/{role}?team=<TEAM>&next=<...> (team은 전달 시에만 포함)
11-
* - 200(또는 body.code=200) 이면 통과, 아니면 /auth/signin?next=... 로 이동
10+
* - /auth/{role}?next=<...>&team=<...>(옵션) 호출해 200(또는 body.code=200)이면 통과
11+
* - 아니면 로그인(/auth/signin?next=...)으로 보냄
1212
*
1313
* props:
14-
* - requiredRole: 'GUEST'|'MEMBER'|'CORE'|'LEAD'|'ORGANIZER'|'ADMIN' (필수)
15-
* - requiredTeam?: 'HR'|'BD'|'TECH'|'PR_DESIGN' ... (선택, 전달 시에만 서버에 team 쿼리 포함)
16-
* - nextOverride?: string (선택)
14+
* - requiredRole: 'GUEST'|'MEMBER'|'CORE'|'LEAD'|'ORGANIZER'|'ADMIN'
15+
* - requiredTeam?: 'HR'|'BD'|'TECH'|'PR_DESIGN' (옵션, 주어질 때만 쿼리에 포함)
16+
* - nextOverride?: string
17+
* - children: ReactNode
1718
*/
1819
export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverride, children}) {
1920
const router = useRouter();
@@ -24,7 +25,7 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
2425
const [checking, setChecking] = useState(true);
2526
const [allowed, setAllowed] = useState(false);
2627

27-
// 사용자가 원래 가려던 경로 (로그인 실패 시 next로 넘김)
28+
// next URL 계산 (override > 현재 경로)
2829
const nextUrl = useMemo(() => {
2930
if (nextOverride) return encodeURIComponent(nextOverride);
3031
const q = searchParams?.toString();
@@ -35,6 +36,7 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
3536

3637
useEffect(() => {
3738
if (!requiredRole) {
39+
// 역할이 없으면 바로 차단
3840
router.replace(`/auth/signin?next=${nextUrl}`);
3941
return;
4042
}
@@ -43,18 +45,11 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
4345

4446
const verify = async () => {
4547
try {
46-
// 쿼리 파라미터를 조건부로 구성
48+
// ✅ 권한 체크: /auth/{role}?next=... (&team=... 은 전달된 경우에만)
4749
const params = {next: decodeURIComponent(nextUrl)};
48-
if (requiredTeam) {
49-
params.team = requiredTeam;
50-
}
50+
if (requiredTeam) params.team = requiredTeam;
5151

52-
const res = await apiClient.get(`/auth/${requiredRole}`, {
53-
params, headers: {
54-
Accept: 'application/json',
55-
}, // 401/403도 정상 분기로 처리
56-
validateStatus: (s) => s === 200 || s === 204 || s === 401 || s === 403,
57-
});
52+
const res = await apiClient.get(`/auth/${requiredRole}`, {params});
5853

5954
if (cancelledRef.current) return;
6055

@@ -64,9 +59,6 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
6459
if (okHttp && okBody) {
6560
setAllowed(true);
6661
} else {
67-
if (res?.status === 403) {
68-
alert('권한이 부족합니다.');
69-
}
7062
router.replace(`/auth/signin?next=${nextUrl}`);
7163
}
7264
} catch {
@@ -79,6 +71,7 @@ export default function ApiCodeGuard({requiredRole, requiredTeam = '', nextOverr
7971
};
8072

8173
void verify();
74+
8275
return () => {
8376
cancelledRef.current = true;
8477
};

0 commit comments

Comments
 (0)