UNPKG

aegis-auth

Version:

A credentials-based auth solution for Next.js (and other Node projects) with IP rate-limiting, account lockouts, and sessions in DB.

83 lines 3.11 kB
import { VerificationType } from "@prisma/client"; import { ErrorCodes } from "../types"; import { limitIpAttempts } from "../utils"; import { verifyEmailSchema } from "../validations"; import { useVerificationToken } from "./useVerificationToken"; export async function verifyEmail(context, input) { var _a; const { prisma, config, limiters, parsedRequest } = context; const { ipAddress } = parsedRequest !== null && parsedRequest !== void 0 ? parsedRequest : {}; try { const validatedInput = verifyEmailSchema.safeParse(input); if (!validatedInput.success) { config.logger.securityEvent("INVALID_INPUT", { route: "verifyEmail" }); return { success: false, status: 400, message: "Invalid input provided", code: ErrorCodes.INVALID_INPUT, }; } const { token } = validatedInput.data; if (config.rateLimiting.verifyEmail.enabled && ipAddress) { const limiter = limiters.verifyEmail; const limit = await limitIpAttempts({ ipAddress, limiter }); if (!limit.success) { config.logger.securityEvent("RATE_LIMIT_EXCEEDED", { route: "verifyEmail", ipAddress, }); return { success: false, status: 429, message: "Too many attempts. Try again later.", code: ErrorCodes.RATE_LIMIT_EXCEEDED, }; } } const verification = await useVerificationToken(context, { token: token, type: VerificationType.EMAIL_VERIFICATION, }); if (!verification.success || !((_a = verification.data) === null || _a === void 0 ? void 0 : _a.verification)) { config.logger.securityEvent("INVALID_TOKEN", { route: "verifyEmail", ipAddress, }); return { success: false, status: 400, message: "Invalid token.", code: ErrorCodes.INVALID_TOKEN, }; } const { verification: { userId }, } = verification.data; await prisma.user.update({ where: { id: userId }, data: { isEmailVerified: true }, }); config.logger.securityEvent("EMAIL_VERIFIED", { userId, ipAddress, }); return { success: true, status: 200, message: "Email verified.", }; } catch (error) { config.logger.error("Error verifying email", { error, token: input.token, ipAddress: parsedRequest === null || parsedRequest === void 0 ? void 0 : parsedRequest.ipAddress, }); return { success: false, status: 500, message: "An unexpected error occurred.", code: ErrorCodes.INTERNAL_SERVER_ERROR, }; } } //# sourceMappingURL=verifyEmail.js.map