62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
import bcrypt from 'bcryptjs'
|
|
import jwt from 'jsonwebtoken'
|
|
import { prisma } from '@/lib/prisma'
|
|
import type { NextRequest } from 'next/server'
|
|
|
|
const JWT_SECRET = process.env.JWT_SECRET || 'your-jwt-secret-here'
|
|
|
|
export async function hashPassword(password: string): Promise<string> {
|
|
return await bcrypt.hash(password, 12)
|
|
}
|
|
|
|
export async function verifyPassword(password: string, hashedPassword: string): Promise<boolean> {
|
|
return await bcrypt.compare(password, hashedPassword)
|
|
}
|
|
|
|
export function generateToken(payload: any): string {
|
|
return jwt.sign(payload, JWT_SECRET, { expiresIn: '7d' })
|
|
}
|
|
|
|
export function verifyToken(token: string): any {
|
|
try {
|
|
return jwt.verify(token, JWT_SECRET)
|
|
} catch (error) {
|
|
return null
|
|
}
|
|
}
|
|
|
|
export async function getUser(request: NextRequest) {
|
|
try {
|
|
const authHeader = request.headers.get('Authorization')
|
|
const token = authHeader?.replace('Bearer ', '')
|
|
|
|
if (!token) {
|
|
return null
|
|
}
|
|
|
|
const decoded = verifyToken(token)
|
|
if (!decoded || !decoded.userId) {
|
|
return null
|
|
}
|
|
|
|
const user = await prisma.user.findUnique({
|
|
where: { id: decoded.userId },
|
|
select: {
|
|
id: true,
|
|
email: true,
|
|
username: true,
|
|
name: true,
|
|
phone: true,
|
|
address: true,
|
|
isAdmin: true,
|
|
createdAt: true
|
|
}
|
|
})
|
|
|
|
return user
|
|
} catch (error) {
|
|
console.error('获取用户信息失败:', error)
|
|
return null
|
|
}
|
|
}
|