// Token validation error codes const TOKEN_ERROR_CODE = { SUCCESS: 0, LOGIN_INFO_ERROR: 40101, LOGIN_INFO_INVALID: 40102, TOKEN_EXPIRED: 40103, TOKEN_INVALID: 40104, } as const type TokenErrorCode = (typeof TOKEN_ERROR_CODE)[keyof typeof TOKEN_ERROR_CODE] interface TokenValidationResponse { code: number } export const useTokenValidation = () => { const runtimeConfig = useRuntimeConfig() const modalStore = useModalStore() const gameDataStore = useGameDataStore() const { tm } = useI18n() const { gameId } = storeToRefs(gameDataStore) const apiBaseUrl = runtimeConfig.public.stoveApiUrl const stoveCs = runtimeConfig.public.stoveCs const customerServiceUrl = `${stoveCs}/${gameId.value}` const isTokenValid = ref(false) // 로그인 모달 표시 const showLoginModal = (alertKey: string) => { modalStore.handleOpenConfirm({ contentText: tm(alertKey), confirmButtonText: tm('Text_StoveLogin'), confirmButtonEvent: () => { csrGoStoveLogin() }, }) } // 에러 모달 표시 const showErrorModal = () => { modalStore.handleOpenConfirm({ contentText: tm('Alert_Error'), confirmButtonText: tm('Text_Customer'), confirmButtonEvent: () => { window.open(customerServiceUrl, '_blank') }, }) } // 토큰 검증 API 호출 const validateToken = async ( token: string ): Promise => { if (!token) { return false } try { const result = (await commonFetch( 'GET', `${apiBaseUrl}/auth/v5/user_token/check`, { headers: { Authorization: `bearer ${token}`, }, } )) as TokenValidationResponse isTokenValid.value = result.code === TOKEN_ERROR_CODE.SUCCESS return result.code as TokenErrorCode } catch (error) { isTokenValid.value = false if (process.env.NODE_ENV === 'development') { console.error('[useTokenValidation] API 호출 실패:', error) } return false } } // 토큰 검증 및 에러 처리 const handleTokenValidation = async (token: string): Promise => { // 토큰 없음 if (!token) { showLoginModal('Alert_StoveLogin') return false } const result = await validateToken(token) // API 호출 실패 if (result === false) { showErrorModal() return false } // 검증 성공 if (result === TOKEN_ERROR_CODE.SUCCESS) { return true } // 로그인 정보 오류 if ( result === TOKEN_ERROR_CODE.LOGIN_INFO_ERROR || result === TOKEN_ERROR_CODE.LOGIN_INFO_INVALID ) { showLoginModal('Alert_40101') return false } // 토큰 만료 if ( result === TOKEN_ERROR_CODE.TOKEN_EXPIRED || result === TOKEN_ERROR_CODE.TOKEN_INVALID ) { showLoginModal('Alert_40103') return false } // 기타 에러 showErrorModal() return false } return { isTokenValid, validateToken, handleTokenValidation, } }