route.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { verifyToken, deleteVerificationToken, findUserByEmail, verifyUserEmail } from '@/lib/user-service';
  3. export async function GET(request: NextRequest) {
  4. try {
  5. const { searchParams } = new URL(request.url);
  6. const token = searchParams.get('token');
  7. if (!token) {
  8. return NextResponse.json(
  9. { error: 'Verification token is missing' },
  10. { status: 400 }
  11. );
  12. }
  13. // 验证令牌
  14. const tokenResult = await verifyToken(token, 'email_verification');
  15. if (!tokenResult.isValid || !tokenResult.email) {
  16. return NextResponse.json(
  17. { error: 'Invalid or expired verification token' },
  18. { status: 400 }
  19. );
  20. }
  21. // 查找用户
  22. const user = await findUserByEmail(tokenResult.email);
  23. if (!user) {
  24. return NextResponse.json(
  25. { error: 'User not found' },
  26. { status: 404 }
  27. );
  28. }
  29. // 如果邮箱已验证,直接返回成功
  30. if (user.isEmailVerified) {
  31. await deleteVerificationToken(token);
  32. return NextResponse.json({
  33. message: 'Email already verified',
  34. verified: true,
  35. });
  36. }
  37. // 验证用户邮箱
  38. const verificationSuccess = await verifyUserEmail(user.id);
  39. if (!verificationSuccess) {
  40. return NextResponse.json(
  41. { error: 'Email verification failed' },
  42. { status: 500 }
  43. );
  44. }
  45. // 删除验证令牌
  46. await deleteVerificationToken(token);
  47. return NextResponse.json({
  48. message: 'Email verified successfully',
  49. verified: true,
  50. });
  51. } catch (error) {
  52. console.error('邮箱验证错误:', error);
  53. return NextResponse.json(
  54. { error: 'Internal server error' },
  55. { status: 500 }
  56. );
  57. }
  58. }