feat: Implement user authentication, admin user management, and role-based access control.
This commit is contained in:
parent
8a2ca592bc
commit
38648581ec
19 changed files with 1762 additions and 514 deletions
|
|
@ -4,7 +4,8 @@ import { authService } from '~/services/auth.service';
|
|||
interface User {
|
||||
id: string;
|
||||
email: string;
|
||||
fullName: string;
|
||||
firstName: string;
|
||||
lastName: string;
|
||||
role: 'INSTRUCTOR' | 'ADMIN' | 'STUDENT';
|
||||
}
|
||||
|
||||
|
|
@ -24,23 +25,32 @@ export const useAuthStore = defineStore('auth', {
|
|||
actions: {
|
||||
async login(email: string, password: string) {
|
||||
try {
|
||||
// Call real API
|
||||
const response = await authService.login(email, password);
|
||||
|
||||
this.token = response.token;
|
||||
this.user = response.user as User;
|
||||
this.isAuthenticated = true;
|
||||
|
||||
// Save to localStorage (including refreshToken)
|
||||
if (process.client) {
|
||||
localStorage.setItem('token', this.token);
|
||||
localStorage.setItem('refreshToken', response.refreshToken);
|
||||
localStorage.setItem('user', JSON.stringify(this.user));
|
||||
}
|
||||
// Save to cookies
|
||||
const tokenCookie = useCookie('token', {
|
||||
maxAge: 60 * 60 * 24, // 24 hours
|
||||
sameSite: 'strict'
|
||||
});
|
||||
const refreshTokenCookie = useCookie('refreshToken', {
|
||||
maxAge: 60 * 60 * 24 * 7, // 7 days
|
||||
sameSite: 'strict'
|
||||
});
|
||||
const userCookie = useCookie('user', {
|
||||
maxAge: 60 * 60 * 24, // 24 hours
|
||||
sameSite: 'strict'
|
||||
});
|
||||
|
||||
tokenCookie.value = this.token;
|
||||
refreshTokenCookie.value = response.refreshToken;
|
||||
userCookie.value = JSON.stringify(this.user);
|
||||
|
||||
return { token: this.token, user: this.user };
|
||||
} catch (error: any) {
|
||||
// Re-throw error to be handled by login page
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
|
@ -50,21 +60,30 @@ export const useAuthStore = defineStore('auth', {
|
|||
this.token = null;
|
||||
this.isAuthenticated = false;
|
||||
|
||||
if (process.client) {
|
||||
localStorage.removeItem('token');
|
||||
localStorage.removeItem('user');
|
||||
}
|
||||
// Clear cookies
|
||||
const tokenCookie = useCookie('token');
|
||||
const refreshTokenCookie = useCookie('refreshToken');
|
||||
const userCookie = useCookie('user');
|
||||
|
||||
tokenCookie.value = null;
|
||||
refreshTokenCookie.value = null;
|
||||
userCookie.value = null;
|
||||
},
|
||||
|
||||
checkAuth() {
|
||||
if (process.client) {
|
||||
const token = localStorage.getItem('token');
|
||||
const user = localStorage.getItem('user');
|
||||
const tokenCookie = useCookie('token');
|
||||
const userCookie = useCookie('user');
|
||||
|
||||
if (token && user) {
|
||||
this.token = token;
|
||||
this.user = JSON.parse(user);
|
||||
if (tokenCookie.value && userCookie.value) {
|
||||
this.token = tokenCookie.value;
|
||||
try {
|
||||
this.user = typeof userCookie.value === 'string'
|
||||
? JSON.parse(userCookie.value)
|
||||
: userCookie.value;
|
||||
this.isAuthenticated = true;
|
||||
} catch (e) {
|
||||
// Invalid user data
|
||||
this.logout();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue