access_token 쿠키 확인하여 로그인 상태 유지 처리
ProtectedRoute 로 로그인 필요 페이지 접근 관리 import 문을 src/ 포함된 절대경로로 개선
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import React, { createContext, useReducer, useEffect } from 'react';
|
||||
|
||||
import { getCurrentUser, isTokenValid } from 'src/axios/authService';
|
||||
import { isTokenValid, getAccessTokenFromCookie, getUserFromToken } from 'src/axios/authService';
|
||||
|
||||
// 사용자 타입 정의
|
||||
export interface Member {
|
||||
@@ -33,13 +33,16 @@ const initialState: AuthState = {
|
||||
error: null
|
||||
};
|
||||
|
||||
// Context 생성
|
||||
export const AuthContext = createContext<{
|
||||
// Context 타입 정의
|
||||
export interface AuthContextType {
|
||||
state: AuthState;
|
||||
dispatch: React.Dispatch<AuthAction>;
|
||||
login: (token: string, member: Member) => void;
|
||||
logout: () => void;
|
||||
}>({
|
||||
}
|
||||
|
||||
// Context 생성
|
||||
export const AuthContext = createContext<AuthContextType>({
|
||||
state: initialState,
|
||||
dispatch: () => null,
|
||||
login: () => null,
|
||||
@@ -118,7 +121,8 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
||||
// 초기 인증 상태 확인
|
||||
useEffect(() => {
|
||||
const loadUser = async () => {
|
||||
const token = localStorage.getItem('accessToken');
|
||||
// localStorage 또는 Cookie에서 토큰 확인
|
||||
let token = localStorage.getItem('accessToken') || getAccessTokenFromCookie();
|
||||
|
||||
if (!token || !isTokenValid(token)) {
|
||||
dispatch({ type: 'LOGOUT' });
|
||||
@@ -126,8 +130,21 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
||||
}
|
||||
|
||||
try {
|
||||
const member = await getCurrentUser();
|
||||
dispatch({ type: 'MEMBER_LOADED', payload: member });
|
||||
// 토큰이 쿠키에만 있고 localStorage에 없으면 저장해줌 (일관성 유지)
|
||||
if (!localStorage.getItem('accessToken')) {
|
||||
localStorage.setItem('accessToken', token);
|
||||
}
|
||||
|
||||
const decodedToken = getUserFromToken(token);
|
||||
if (decodedToken) {
|
||||
const member: Member = {
|
||||
memberId: decodedToken.memberId,
|
||||
memberName: decodedToken.memberName
|
||||
};
|
||||
dispatch({ type: 'MEMBER_LOADED', payload: member });
|
||||
} else {
|
||||
dispatch({ type: 'AUTH_ERROR', payload: 'Invalid token' });
|
||||
}
|
||||
} catch (error) {
|
||||
dispatch({ type: 'AUTH_ERROR', payload: 'Authentication failed' });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user