반응형
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
}
}
반응형