35 lines
822 B
TypeScript
35 lines
822 B
TypeScript
import { nanoid } from 'nanoid'
|
|
import { getHeader, createError } from 'h3'
|
|
|
|
const tokens = new Map<string, number>()
|
|
|
|
const TOKEN_TTL = 24 * 60 * 60 * 1000
|
|
|
|
export function createToken(): string {
|
|
const token = nanoid(32)
|
|
tokens.set(token, Date.now() + TOKEN_TTL)
|
|
return token
|
|
}
|
|
|
|
export function validateToken(token: string | undefined): boolean {
|
|
if (!token) return false
|
|
const expiry = tokens.get(token)
|
|
if (!expiry) return false
|
|
if (Date.now() > expiry) {
|
|
tokens.delete(token)
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
export function removeToken(token: string): void {
|
|
tokens.delete(token)
|
|
}
|
|
|
|
export function requireAuth(event: any): void {
|
|
const token = getHeader(event, 'x-auth-token')
|
|
if (!validateToken(token)) {
|
|
throw createError({ statusCode: 401, statusMessage: 'Unauthorized' })
|
|
}
|
|
}
|