Files
Avtex/app/server/utils/auth.ts
T

62 lines
1.4 KiB
TypeScript

import jwt from 'jsonwebtoken'
import { H3Event, createError } from 'h3'
export interface AuthUser {
id: string
email: string
username: string
displayName?: string
role?: string
}
export function generateToken(user: AuthUser): string {
const config = useRuntimeConfig()
const secret = config.jwtSecret || 'your-super-secret-jwt-key'
return jwt.sign(
{
id: user.id,
email: user.email,
username: user.username,
displayName: user.displayName,
role: user.role || 'user'
},
secret,
{ expiresIn: '7d' }
)
}
export function verifyToken(token: string): AuthUser {
const config = useRuntimeConfig()
const secret = config.jwtSecret || 'your-super-secret-jwt-key'
return jwt.verify(token, secret) as AuthUser
}
export function getAuthUser(event: H3Event): AuthUser | null {
const authHeader = getHeader(event, 'authorization')
const token = authHeader?.split(' ')[1]
if (!token) return null
try {
return verifyToken(token)
} catch {
return null
}
}
export function requireAuth(event: H3Event): AuthUser {
const user = getAuthUser(event)
if (!user) {
throw createError({ statusCode: 401, message: 'Unauthorized' })
}
return user
}
export function requireRole(event: H3Event, role: string): AuthUser {
const user = requireAuth(event)
if (user.role !== role) {
throw createError({ statusCode: 403, message: 'Forbidden' })
}
return user
}