Files
OpenIsle/open-isle-cli/src/utils/auth.js
2025-07-09 14:28:01 +08:00

87 lines
2.0 KiB
JavaScript

import { API_BASE_URL } from '../main'
import { reactive } from 'vue'
const TOKEN_KEY = 'token'
const USER_ID_KEY = 'userId'
const USERNAME_KEY = 'username'
export const authState = reactive({
loggedIn: false,
userId: null,
username: null
})
authState.loggedIn = localStorage.getItem(TOKEN_KEY) !== null && localStorage.getItem(TOKEN_KEY) !== ''
authState.userId = localStorage.getItem(USER_ID_KEY)
authState.username = localStorage.getItem(USERNAME_KEY)
export function getToken() {
return localStorage.getItem(TOKEN_KEY)
}
export function setToken(token) {
localStorage.setItem(TOKEN_KEY, token)
authState.loggedIn = true
}
export function clearToken() {
localStorage.removeItem(TOKEN_KEY)
clearUserInfo()
authState.loggedIn = false
}
export function setUserInfo({ id, username }) {
authState.userId = id
authState.username = username
if (id !== undefined && id !== null) localStorage.setItem(USER_ID_KEY, id)
if (username) localStorage.setItem(USERNAME_KEY, username)
}
export function clearUserInfo() {
localStorage.removeItem(USER_ID_KEY)
localStorage.removeItem(USERNAME_KEY)
authState.userId = null
authState.username = null
}
export async function fetchCurrentUser() {
const token = getToken()
if (!token) return null
try {
const res = await fetch(`${API_BASE_URL}/api/users/me`, {
headers: { Authorization: `Bearer ${token}` }
})
if (!res.ok) return null
return await res.json()
} catch (e) {
return null
}
}
export async function loadCurrentUser() {
const user = await fetchCurrentUser()
if (user) {
setUserInfo({ id: user.id, username: user.username })
}
return user
}
export function isLogin() {
return authState.loggedIn
}
export async function checkToken() {
const token = getToken()
if (!token) return false
try {
const res = await fetch(`${API_BASE_URL}/api/auth/check`, {
headers: { Authorization: `Bearer ${token}` }
})
authState.loggedIn = res.ok
return res.ok
} catch (e) {
authState.loggedIn = false
return false
}
}