본문 바로가기
카테고리 없음

logout

by 두잇건강 2025. 8. 14.
반응형

import { ref, computed } from 'vue'
import { useRouter } from 'vue-router'
import axios from 'axios'

// 전역 상태
const user = ref(null)
const token = ref(localStorage.getItem('jwt-token'))

export function useAuth() {
  const router = useRouter()

  // 계산된 속성
  const isAuthenticated = computed(() => !!token.value)

  // 로그인 함수
  const login = async (credentials) => {
    try {
      const response = await axios.post('/api/authenticate', credentials)
      
      if (response.data.jwt) {
        token.value = response.data.jwt
        user.value = response.data.email || credentials.email
        
        // localStorage에 토큰 저장
        localStorage.setItem('jwt-token', response.data.jwt)
        
        // axios 헤더 설정
        setAuthToken(response.data.jwt)
        
        return { success: true }
      }
    } catch (error) {
      return { 
        success: false, 
        error: error.response?.status === 401 
          ? '이메일 또는 비밀번호가 올바르지 않습니다.' 
          : '로그인 중 오류가 발생했습니다.' 
      }
    }
  }

  // 로그아웃 함수
  const logout = () => {
    token.value = null
    user.value = null
    localStorage.removeItem('jwt-token')
    delete axios.defaults.headers.common['Authorization']
    router.push('/login')
  }

  // 토큰 설정 함수
  const setAuthToken = (authToken) => {
    if (authToken) {
      axios.defaults.headers.common['Authorization'] = `Bearer ${authToken}`
    } else {
      delete axios.defaults.headers.common['Authorization']
    }
  }

  // 초기화 함수
  const initialize = () => {
    if (token.value) {
      setAuthToken(token.value)
      // 토큰에서 사용자 정보 추출 (실제로는 JWT 디코딩 라이브러리 사용)
      user.value = '사용자' // 임시
    }
  }

  return {
    user: computed(() => user.value),
    token: computed(() => token.value),
    isAuthenticated,
    login,
    logout,
    initialize
  }
}
반응형