62 lines
1.4 KiB
TypeScript
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
|
|
}
|