cf7c29639c
Backend: config/db/security/logging core, SQLAlchemy models (Server, Credential, UpdateJob, UpdateLog, AuditLog, User), services (winrm, ssh, cau, audit, job_runner), REST API (auth, servers, updates, audit), Socket.io WebSocket layer. Frontend: Vue 3 + TS + Pinia + Tailwind, Views (Dashboard, Servers, Updates, Audit, Login), axios + socket.io-client, nginx prod config.
33 lines
935 B
TypeScript
33 lines
935 B
TypeScript
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
import { apiClient } from '@/api/client'
|
|
import { disconnectSocket } from '@/api/socket'
|
|
|
|
const TOKEN_KEY = 'iu_token'
|
|
|
|
export const useAuthStore = defineStore('auth', () => {
|
|
const token = ref<string | null>(localStorage.getItem(TOKEN_KEY))
|
|
const username = ref<string | null>(null)
|
|
|
|
const isAuthenticated = computed(() => token.value !== null)
|
|
|
|
async function login(user: string, password: string): Promise<void> {
|
|
const { data } = await apiClient.post('/api/auth/login', {
|
|
username: user,
|
|
password,
|
|
})
|
|
token.value = data.access_token
|
|
username.value = user
|
|
localStorage.setItem(TOKEN_KEY, data.access_token)
|
|
}
|
|
|
|
function logout(): void {
|
|
token.value = null
|
|
username.value = null
|
|
localStorage.removeItem(TOKEN_KEY)
|
|
disconnectSocket()
|
|
}
|
|
|
|
return { token, username, isAuthenticated, login, logout }
|
|
})
|